Почему я не могу использовать Start-Process для вызова скрипта с параметрами? - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь написать скрипт-оболочку в Powershell, которому передается имя исполняемого файла, выполняется некоторая предварительная обработка, а затем вызывается этот исполняемый файл с аргументами, полученными в результате этой предварительной обработки. Я хочу, чтобы исполняемый файл представлял собой все, что вы можете запустить / открыть на Windows, поэтому я хочу использовать Start-Process для его запуска, чтобы вызывал второй сценарий с аргументами из сценария (который ссылается на Invoke-Expression) не очень актуально. Я обнаружил, что когда исполняемый файл представляет собой другой скрипт Powershell, сценарий не видит аргументов.

Мой маленький глупый тест:

Write-Output "Arg0: '$($Args[0])', Arg1: '$($Args[1])'" >>test.log

И работает над PS подскажите вот что я вижу:

PS C:\Source> .\test.ps1 a b
PS C:\Source> more .\test.log
Arg0: 'a', Arg1: 'b'

PS C:\Source> .\test.ps1 c d
PS C:\Source> more .\test.log
Arg0: 'a', Arg1: 'b'
Arg0: 'c', Arg1: 'd'

PS C:\Source> Start-Process .\test.ps1 -ArgumentList e,f
PS C:\Source> Start-Process .\test.ps1 -Args e,f
PS C:\Source> more .\test.log                                                                                   
Arg0: 'a', Arg1: 'b'
Arg0: 'c', Arg1: 'd'
Arg0: '', Arg1: ''
Arg0: '', Arg1: ''

PS C:\Source>   

Что согласуется с тем, что я вижу при использовании Start-Process в скрипте. Я провожу пару часов, гугляя, не найдя ответа. Есть мысли?

Я работаю над Windows 10 для разработки, но моя цель - Windows Сервер. Я не знаю, что это должно иметь значение.

1 Ответ

2 голосов
/ 06 февраля 2020

Вам нужно вызвать скрипт через powershell.exe:

Start-Process powershell -ArgumentList "-File .\test.ps1 arg1 arg2 argX"

Вы можете указать список аргументов в виде строки или массива строк. См. Пример 7 здесь для получения дополнительной информации.

Как указано @ mklement0 в комментарии к вопросу, если вы не вызовете его через powershell.exe, он выполнит его в контексте по умолчанию Windows считает, что .ps1 файлы должны быть выполнены, что не передает дополнительные аргументы скрипту в этом случае.


Возможно, вам не нужно использовать Start-Process, хотя - если вы не Не требуются какие-либо специальные функции, предоставляемые Start-Process, вы также можете просто вызвать скрипт, используя оператор вызова & или указав путь к скрипту, как в интерактивном режиме:

# You can use a variable with the path to the script
# in place of .\test.ps1 here and provide the arguments
# as variables as well, which lets you build a dynamic
# command out without using `Start-Process` or `Invoke-Expression`.
& .\test.ps1 arg1 arg2 argX

или

# You can use variables for the arguments here, but the script name
# must be hardcoded. Good for cases where the entrypoint doesn't change.
.\test.ps1 arg1 arg2 argX

Возможно, вы также захотите использовать аргумент splatting для своих аргументов, а также при построении динамических c команд. Я также написал здесь ответ , который более детально описывает брызги.

...