Мне нужно запустить скрипт 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 и т. Д.