Передача параметров 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.
надеюсь, это поможет.