Invoke-WebRequest 对路径的访问被拒绝 UnauthorizedAccessException

Invoke-WebRequest 对路径的访问被拒绝 UnauthorizedAccessException

我正在Invoke-WebRequest以管理员身份运行 Windows Powershell。

当我运行以下命令时:Invoke-WebRequest http://speedtest.newark.linode.com/100MB-newark.bin -OutFile $env:TEMP:(正如这里推荐的),我收到一条错误信息Access to Path is Denied(见下图)。

在此处输入图片描述

我尝试过但没有效果的方法:

  • 在 Windows Server 2008 和 2012 以及 Windows 8.1 上运行该命令。
  • 取消选中文件夹属性Read-Only下的设置权限Temp
  • 我改成$env:TEMPC:\

该错误在所有测试的操作系统中都是一致的。

答案1

看起来您访问被拒绝了,因为 OutFile 参数正在尝试在 AppData/Local 文件夹中创建一个名为 TEMP 的文件,但已经有一个名为 TEMP 的目录,因此存在命名冲突。我在运行您的命令时收到了同样的错误,然后我添加了一个文件名,它就成功了。见下文:

Invoke-WebRequest http://speedtest.newark.linode.com/100MB-newark.bin -OutFile $env:TEMP\100MB-newark.bin

答案2

您的命令适用于我的系统(Windows-7 SP1 x64)。以普通用户和管理员身份运行均可……(但以管理员身份运行似乎有风险)。我测试了 x86 和 x64 版本的 Powershell

算法哈希路径
--------- ---- --------------------
SHA256 A99192624C502AF0BF635D1186AC6ECAD613F0E4A48F5BA8D47B6E261C204908 C:\Temp\scratch\100MB-newark.bin

SHA1 79105A819B8A0FB67DDCDEADC8E47C7F59DB8677 C:\Temp\scratch\100MB-newark.bin

MD5 5F293997D8F256F9C6880272E0773429 C:\Temp\scratch\100MB-newark.bin

下面是我使用的巧妙的 Get-Webfile 函数:将其添加到您的 $PROFILE 或 .source 中。:)

Function Get-Webfile ($url)
{
    $dest=(Join-Path $pwd.Path $url.SubString($url.LastIndexOf('/')))
    Write-Host "Downloading $url`n" -ForegroundColor DarkGreen;
    $uri=New-Object "System.Uri" "$url"
    $request=[System.Net.HttpWebRequest]::Create($uri)
    $request.set_Timeout(5000)
    $response=$request.GetResponse()
    $totalLength=[System.Math]::Floor($response.get_ContentLength()/1024)
    $length=$response.get_ContentLength()
    $responseStream=$response.GetResponseStream()
    $destStream=New-Object -TypeName System.IO.FileStream -ArgumentList $dest, Create
    $buffer=New-Object byte[] 10KB
    $count=$responseStream.Read($buffer,0,$buffer.length)
    $downloadedBytes=$count
    while ($count -gt 0)
        {
        [System.Console]::CursorLeft=0
        [System.Console]::Write("Downloaded {0}K of {1}K ({2}%)", [System.Math]::Floor($downloadedBytes/1024), $totalLength, [System.Math]::Round(($downloadedBytes / $length) * 100,0))
        $destStream.Write($buffer, 0, $count)
        $count=$responseStream.Read($buffer,0,$buffer.length)
        $downloadedBytes+=$count
        }
    Write-Host ""
    Write-Host "`nDownload of `"$dest`" finished." -ForegroundColor DarkGreen;
    $destStream.Flush()
    $destStream.Close()
    $destStream.Dispose()
    $responseStream.Dispose()
}

** 也许测量命令在该管道的某个地方会更有用,以提高速度。

相关内容