Во время запроса веб-клиента в powershell происходит исключение.Как это исправить? - PullRequest
1 голос
/ 20 апреля 2019

Я использую Windows 7. В ней установлена ​​PowerShell версии 2.Но в версии есть ошибка с разделенным путем.Поэтому я пошел с System.IO.Path для загрузки и выполнения сценария PowerShell.Но это все еще показывает ошибку.

Это ошибка, которую я получаю:

+ @('https://cdn.bringatrailer.com/wp-content/uploads/2018/01/GTX-Low-Res-4-940
x627.jpg','https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/2019_Ford_
Mustang_GT_5.0_facelift.jpg/1200px-2019_Ford_Mustang_GT_5.0_facelift.jpg') |for
each{$fileName = $env:TEMP + ([System.IO.Path]::GetFileName($Path) );(New-Objec
t System.Net.WebClient).DownloadFile <<<< ($_,$fileName);Invoke-Item $fileName}
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException
Exception calling "DownloadFile" with "2" argument(s): "An exception occurred d
uring a WebClient request."
At line:1 char:351
+ @('https://cdn.bringatrailer.com/wp-content/uploads/2018/01/GTX-Low-Res-4-940
x627.jpg','https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/2019_Ford_
Mustang_GT_5.0_facelift.jpg/1200px-2019_Ford_Mustang_GT_5.0_facelift.jpg') |for
each{$fileName = $env:TEMP + ([System.IO.Path]::GetFileName($Path) );(New-Objec
t System.Net.WebClient).DownloadFile <<<< ($_,$fileName);Invoke-Item $fileName}
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

Вот мой код, который я пытался запустить:

@echo off


powershell "@('https://cdn.bringatrailer.com/wp-content/uploads/2018/01/GTX-Low-Res-4-940x627.jpg','https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/2019_Ford_Mustang_GT_5.0_facelift.jpg/1200px-2019_Ford_Mustang_GT_5.0_facelift.jpg') |foreach{$fileName = $env:TEMP + ([System.IO.Path]::GetFileName($Path) );(New-Object System.Net.WebClient).DownloadFile($_,$fileName);Invoke-Item $fileName}"

1 Ответ

0 голосов
/ 21 апреля 2019

PowerShell 2 устарел и больше не получает никаких обновлений и имеет серьезные проблемы с рисками по сравнению с текущим состоянием отрасли и тем, что более новые версии предоставляют для контроля.

Win7 может использовать PowerShell v5x.Я настоятельно рекомендую вам обновить и использовать веб-командлеты для этих усилий и воспользоваться преимуществами новых версий.

Теперь к вам проблема.Здесь у вас есть проблемы с синтаксисом, даже то, как вы используете PowerShell v2.

@ echo off --- это cmd.exe .bat / .cmd, а не PowerShell.

Если вы откроете это в ISE или VSCode, вы увидите, что это показывается как ошибка.Таким образом, это не нужно.

Для того, что вы ищете, посмотрите на эту статью: 3 способа загрузки файлов с помощью PowerShell

# 1. Invoke-WebRequest

$url = "http://mirror.internode.on.net/pub/test/10meg.test"
$output = "$PSScriptRoot\10meg.test"
$start_time = Get-Date

Invoke-WebRequest -Uri $url -OutFile $output
Write-Output "Time taken: $((Get-Date).Subtract($start_time).Seconds) second(s)"


# 2. System.Net.WebClient

$url = "http://mirror.internode.on.net/pub/test/10meg.test"
$output = "$PSScriptRoot\10meg.test"
$start_time = Get-Date

$wc = New-Object System.Net.WebClient
$wc.DownloadFile($url, $output)

#Or

(New-Object System.Net.WebClient).DownloadFile($url, $output)
Write-Output "Time taken: $((Get-Date).Subtract($start_time).Seconds) second(s)"


# 3. Start-BitsTransfer

$url = "http://mirror.internode.on.net/pub/test/10meg.test"
$output = "$PSScriptRoot\10meg.test"
$start_time = Get-Date

Import-Module BitsTransfer
Start-BitsTransfer -Source $url -Destination $output

#Or

Start-BitsTransfer -Source $url -Destination $output -Asynchronous
Write-Output "Time taken: $((Get-Date).Subtract($start_time).Seconds) second(s)"

Это было быМой подход к вашему варианту использования:

# DownloadPic.ps1

'https://cdn.bringatrailer.com/wp-content/uploads/2018/01/GTX-Low-Res-4-940x627.jpg',
'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/2019_Ford_Mustang_GT_5.0_facelift.jpg/1200px-2019_Ford_Mustang_GT_5.0_facelift.jpg' | 
foreach{
    $webclient = New-Object System.Net.WebClient
    $filename = [System.IO.Path]::GetFileName($PSItem)
    $file = "E:\Temp\$filename"
    $webclient.DownloadFile($url,$file)
}

Тем не менее, если вы пытаетесь выполнить традиционный двойной щелчок для запуска файла, который изначально не работает с PowerShell, значит, вы используете командный файлза усилие двойного щелчка, тогда я получаю это.

Вы сохранили бы вышеупомянутое как файл .ps1, и в своем пакетном файле просто назовите его, как-то так.

DownloadPic.bat

::rem batch file calling powershell to download pics.
@echo off
Powershell -noprofile -File "%~E:\temp\DownloadPic.ps1"

См. Эти вопросы и ответы

... и примечание.Я просто написал это быстро и протестировал, и он загрузил картинки, как и ожидалось.

Тем не менее, вы можете просто запустить приглашение PowerShell и запустить скрипт напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...