![Invoke-WebRequest 对路径的访问被拒绝 UnauthorizedAccessException](https://linux22.com/image/653350/Invoke-WebRequest%20%E5%AF%B9%E8%B7%AF%E5%BE%84%E7%9A%84%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D%20UnauthorizedAccessException.png)
我正在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:TEMP
了C:\
。
该错误在所有测试的操作系统中都是一致的。
答案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()
}
** 也许测量命令在该管道的某个地方会更有用,以提高速度。