Как передать указанные параметры в PowerShell Invoke-Command и ScripBlocks? - PullRequest
4 голосов
/ 29 марта 2012

Мне нужно запустить скрипт ps1 на удаленном компьютере. Сценарию будет передан единственный параметр, представляющий имя файла. Я перепробовал много разных комбинаций и подходов к передаче параметров в блок скрипта, но я всегда получаю ту или иную ошибку , когда пытаюсь поддерживать пробелы в имени скрипта и / или имени файла .

Примечание. Конечным результатом будет запуск сценария на компьютере REMOTE с использованием параметра -ComputerName для Invoke-Command , но для простоты и тестирования всех примеры запускаются локально.

Учитывая пример «удаленного» скрипта

#processFile.ps1
$args[0]     # Just outputs the first parameter passed

Следующие работы, когда в имени нет пробелов

$cmd = ".\processFile.ps1"
$fn = "someFile.csv"
$sb = [ScriptBlock]::Create("$cmd $fn")
Invoke-Command -ScriptBlock $sb

# Outputs the correct
someFile.csv

Однако следующее не работает

$cmd = ".\processFile.ps1"
$fn = "some File.csv"
$sb = [ScriptBlock]::Create("$cmd $fn")
Invoke-Command -ScriptBlock $sb

# Outputs the incorrect
some

Очевидно, что параметр имени файла должен быть экранирован и передан как "some File.csv". И это можно сделать с помощью следующего:

$cmd = ".\processFile.ps1"
$fn = "some File.csv"
$sb = [ScriptBlock]::Create("$cmd `"$fn`"")   # Notice the escape $fn parameter
Invoke-Command -ScriptBlock $sb

# Outputs the correct
some File.csv

НО , когда я пытаюсь расширить поддержку пространства для имени скрипта, все разваливается. Следующее не удается

$cmd = ".\processFile.ps1"
$fn = "some File.csv"
$sb = [ScriptBlock]::Create("`"$cmd`" `"$fn`"") # Notice the attempt to escape both parameters

со следующим исключением

Exception calling "Create" with "1" argument(s): "Unexpected token 'some File.csv' in expression or statement."

Все, что я пробовал, и было много, много разных подходов, привело к чему-то похожему. Я просто не могу получить оба параметра для экранирования. (На самом деле проблема в том, что я не могу избежать параметра first . Некоторые из моих попыток включали вложенные кавычки, одинарные кавычки, [ScriptBlock] :: Create, {}, $ executeContext и т. Д.

Ответы [ 2 ]

6 голосов
/ 29 марта 2012

Попробуйте это:

$sb = [ScriptBlock]::Create(@"
&'$cmd' '$fn'
"@)
4 голосов
/ 07 апреля 2013

Для любого, кто ломает голову над принятым ответом mjolinor, вам нужно добавить:

. $sb

Чтобы он действительно запускал блок скрипта.

Кроме того, более простой синтаксис, который мне кажется более читабельным:

$cmd = @"
&'$cmd' '$fn'
"@
Invoke-Expression $cmd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...