【问题标题】:Passing parameters to PowerShell from bat file从 bat 文件向 PowerShell 传递参数
【发布时间】:2015-12-24 10:29:38
【问题描述】:

我正在拼命尝试将参数从批处理文件传递到 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文件。

【问题讨论】:

  • 您可以做的一件事是不要在批处理调用中使用逗号,并将 $srv 的参数更改为 ValueFromRemainingArguments=$true。你可以在这里看到更多technet.microsoft.com/en-us/library/hh847743.aspx。或者只是将其作为单个字符串引入并使用 -split ","
  • 为什么要从批处理文件中调用 PowerShell 脚本?直接从 PowerShell 运行即可。
  • @Bill_Stewart:我的问题是关于在 .bat 文件中包含 PowerShell,因为我必须这样做。该脚本从一个正在运行的程序启动,该程序不接受除 .bat 和 .cmd 文件之外的其他内容...
  • .cmd.bat 文件不可独立执行;您必须使用 cmd.exe 运行它们。
  • @Bill_Stewart :对不起,我想说我的程序只能启动 cmd.exe

标签: powershell batch-file


【解决方案1】:

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

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

您的批处理调用将如下所示

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

更多详情请关注about_Functions_Advanced_Parameters

【讨论】:

  • 很好的解决方案;据我所知,这是从 PowerShell 外部直接传递值数组的唯一方法。值得注意的一点:使用这种方法,您实际上不得在调用中使用参数name-services,此处)。
【解决方案2】:

最后,我改变了我的方式。 由于我有带空格的服务名称(并且我必须将我的 .ps1 包含在 .bat 文件中),我决定将参数控制放在主目录中,只留下

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

没有控件的行。

谢谢大家。

【讨论】:

    【解决方案3】:

    我通常会从 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,但我们将使用 -computer 和 -filename 来代替 -arg 和 -arg2。

    请记住,它是特定于订单的,因此您可以使用以下参数调用脚本

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

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

    -filename 将始终转到 $filename

    -computer 将始终转到 $computer。

    我希望这会有所帮助。

    【讨论】:

    • OP 已经知道如何从批处理文件中调用 PS 脚本一般,如问题所示。他的问题特别是 array 参数,您的答案没有解决。此外,参数名称在 PowerShell 中区分大小写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2021-08-29
    • 2016-04-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多