从bat文件将参数传递给PowerShell

时间:2015-12-24 10:29:38

标签: powershell batch-file

我正在拼命尝试将参数从批处理文件传递到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,stisvc”的服务不存在。

使用.bat文件时,我的两个名字之间的逗号似乎会引起混淆

因此,我正在努力寻找一种解决方法来赢取这个血腥的.bat文件。

我试过引号,单引号,-File,-Command,但没有成功。

任何线索或解决方案都会非常受欢迎,因为我在这个论坛上的研究没有给我一些可用的东西。

当然,之后我想用参数调用.bat文件。

3 个答案:

答案 0 :(得分:2)

在你的情况下,我将使用:

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

您的批量调用将如下所示

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

有关详细信息,请查看about_Functions_Advanced_Parameters

答案 1 :(得分:-1)

最后,我改变了方向。 因为我有空格的服务名称(我必须在.bat文件中包含我的.ps1),所以我决定将参数控制放在main中,然后离开

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

没有控件的行。

感谢所有人。

答案 2 :(得分:-1)

从我通常做的BAT文件中调用PowerShell脚本

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

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

您的PowerShell脚本文件应该具有类似

的内容
param([string]$arg, [string]$arg2)

在剧本的最顶端和开头。

在我的param([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。

我希望这会有所帮助。