Передача параметров PowerShell из файла bat

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

вот моя полностью оперативная команда:

.nsrservices.ps1 -cmd running nsrexecd,stisvc

но проблема заключается в поведении команды:

  • в окне PowerShell имена служб рассматриваются как два (или более), таким образом, проверяя "nsrexecd", а затем проверяя "stisvc"
  • в пакетном файле передаются имена служб PowerShell как уникальное значение,таким образом, проверяя "nsrexecd, stisvc"

вот мой файл bat:

powershell.exe -File .nsrservices.ps1 -cmd running nsrexecd,stisvc
ECHO.%ERRORLEVEL%
exit /B %ERRORLEVEL%

в моем файле PS параметры определяются следующим образом:

param([string]$cmd=$(throw "Type d'action manquante !"),[string[]]$srv)

в файле журнала у меня есть эти два результата (извините за французский вывод).

из окна PowerShell:

24/12/2015 09:02:50-Paramètres appelés : cmd=running srv=stisvc nsrexecd
24/12/2015 09:02:50-Début test de l'état running du service : stisvc
24/12/2015 09:02:50-    Début évaluation de l'état du service : stisvc
24/12/2015 09:02:50-    Fin évaluation de l'état du service : stisvc
24/12/2015 09:02:50-Le service tourne
24/12/2015 09:02:50-Fin test de l'état running du service : stisvc
24/12/2015 09:02:50-Début test de l'état running du service : nsrexecd
24/12/2015 09:02:50-    Début évaluation de l'état du service : nsrexecd
24/12/2015 09:02:50-    Fin évaluation de l'état du service : nsrexecd
24/12/2015 09:02:50-Le service tourne
24/12/2015 09:02:50-Fin test de l'état running du service : nsrexecd

что означает, что службы тестируются последовательно

от .bat-файла :

24/12/2015 09:04:24-Paramètres appelés : cmd=running srv=nsrexecd,stisvc
24/12/2015 09:04:24-Début test de l'état running du service : nsrexecd,stisvc
24/12/2015 09:04:24-    Début évaluation de l'état du service : nsrexecd,stisvc
24/12/2015 09:04:24-        Le service nsrexecd,stisvc n'existe pas !
24/12/2015 09:04:24-    Fin évaluation de l'état du service : nsrexecd,stisvc
24/12/2015 09:04:24-Fin test de l'état running du service : nsrexecd,stisvc

что означает, что служба 'nsrexecd,оно не существует.

запятая между моими двумя именами, похоже, вызывает путаницу при использовании a .bat файл

поэтому я дергаю свои последние волосы, чтобы найти обходной путь, чтобы выиграть против этого кровавого .Bat-файл.

Я пробовал кавычки, одинарные кавычки, - файл, - команда, но безуспешно.

любая подсказка или решение были бы очень признательны, так как мои исследования на этом форуме не дали мне что-то полезное.

и конечно, после этого я хотел бы назвать .bat файл с параметрами.

3 ответов


в вашем случае я буду использовать :

[parameter(Mandatory=$true,
           ValueFromRemainingArguments=$true)]
[String[]]
$services

ваш пакетный вызов будет выглядеть следующим образом

powershell.exe -File .\nsrservices.ps1 -cmd running nsrexecd stisvc

для получения более подробной информации взгляните на в разделе about_functions_advanced_parameters


наконец, я изменил свой путь. Поскольку у меня были имена служб с пробелами (и я должен был включить свой .ps1 в a .bat file), я решил поставить контроль параметров в основном и просто оставить

param([string]$cmd,[string[]]$srv)

линия без элементов управления.

спасибо всем.


для вызова сценария PowerShell из файла BAT я обычно делаю

PowerShell .\script.ps1 -arg 1234 -arg2 5678

или

PowerShell C:\path\to\script.ps1 -arg 1234 -arg2 5678

ваш файл сценария PowerShell должен иметь что-то вроде

param([string]$arg, [string]$arg2)

в самом верху и начале сценария.

в моем параметре ([string]$arg, [string]$arg2) я определил имена коммутаторов как arg и arg2 соответственно. Таким образом, файл BAT назначит что-либо после-arg $arg и что-либо после-arg2 $arg2.

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

param([string]$computer, [string]$filename)

и в нашем файле BAT мы можем вызвать PowerShell так же, как и выше, но вместо-arg и-arg2 мы будем использовать-computer и-filename.

имейте в виду, что это конкретный порядок, поэтому вы можете вызвать скрипт с аргументами типа

PowerShell .\script.ps1 -computer MyComputer -filename MyFileName

или

PowerShell .\script.ps1 -filename MyFileName -computer MyComputer

-filename всегда будет идти в $ filename

-компьютер всегда будет идти в $computer.

надеюсь, это поможет.