Используйте переменную для пути загрузки Invoke-WebRequest

Я пытаюсь написать сценарий powershell, который будет загружать исполняемый файл с указанного URL-адреса (передается как параметр во время вызова сценария)

Код у меня есть:

Param(
[Parameter(Mandatory=$true,
ValueFromPipeline=$true)]
[String]
$cwdl
)

Start-Job -Name WebReq -ScriptBlock { Invoke-WebRequest $cwdl -OutFile "C:\MYFILEPATH\cw.exe" }
Wait-Job -Name WebReq

Если я заменю $cwdl на «mypathtoexefile», тогда это сработает. Но с переменной $cwdl ничего не происходит. Я даже пытался статически установить $cwdl как $cwdl = 'mypathtoexefile' и $cwdl = "mypathtoexefile", но ничто из того, что я пробовал, не позволяет Invoke-WebRequest разрешать путь к файлу, если я использую переменную, независимо от если он генерируется параметром.


person kurtis452    schedule 08.03.2020    source источник
comment
Вы уверены, что $cwdl имеет правильное содержимое внутри блока сценария? Попробуйте добавить к переменной префикс $script:.   -  person Alex_P    schedule 08.03.2020
comment
Я удалил блок сценария, и вы правы. Мне нужен этот блок сценария на месте, так как остальная часть моего сценария должна дождаться завершения загрузки. Куда добавить префикс? Например: -ScriptBlock { Invoke-WebRequest $Script:$cwdl ... ?   -  person kurtis452    schedule 08.03.2020
comment
@Alex_P: здесь требуется не $script:, а $using:, учитывая, что блок скрипта выполняется в фоновом задании - см. этот ответ.   -  person mklement0    schedule 09.03.2020


Ответы (1)


Пример 8. Передача ввода фоновому заданию В этом примере используется автоматическая переменная $input для обработки объекта ввода. Используйте Receive-Job для просмотра выходных данных задания. PowerShell

Копировать Start-Job -ScriptBlock { Get-Content $input } -InputObject "C:\Servers.txt" Receive-Job -Name Job45 -Keep

Server01 Server02 Server03 Server04 Start-Job использует параметр ScriptBlock для запуска Get-Content с автоматической переменной $input. Переменная $input получает объекты из параметра InputObject. Командлет Receive-Job использует параметр Name для указания задания и выводит результаты. Параметр Keep сохраняет выходные данные задания, чтобы их можно было снова просмотреть во время сеанса PowerShell.

person Lumir J.    schedule 08.03.2020
comment
Как правило, цитируйте свой источник и отформатируйте свой код и пример ввода/вывода. В этом конкретном случае в примере, который вы цитируете, используется неуклюжий, редко используемый метод передачи данных фоновому заданию: вместо передачи аргумента с помощью -ArgumentList (или, проще говоря, прямой ссылки на значение переменной вызывающего объекта с помощью $using: ), в примере используется конвейерный ввод через -InputObject, доступ к которому должен осуществляться через автоматическую переменную $Input внутри блока скрипта. - person mklement0; 09.03.2020