将数组作为参数从CMD传递到PowerShell会产生问题

时间:2017-10-07 05:14:47

标签: powershell cmd

我有问题将数组作为参数从CMD传递给PowerShell脚本。 这是PS代码的一个例子:

[CmdletBinding()]
Param(
    [string[]]$serverArray,
)

$serviceName = 'service1'

function getState {
    Process {
        $serverArray
        foreach ($server in $serverArray) {
            $servState = (Get-WmiObject Win32_Service -ComputerName $server -Filter "name='$serviceName'").State
        }
    }

getState

我如何从CMD调用脚本:

powershell -file .\script.ps1 -serverArray Server1,Server2

我收到错误,因为$serverArray未传递数组:

Server1,Server2
Get-WmiObject : The RPC server is unavailable. (Exception from HRESULT:
0x800706BA)
At C:\script.ps1:58 char:29
+             $servState = (Get-WmiObject <<<<  Win32_Service -ComputerName $server -Filter "name='$serviceName'").State
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], COMException
    + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

如果我从PowerShell窗口运行相同的命令,它可以工作,因为脚本接受$serverArray作为数组:

.\script.ps1 -serverArray Server1,Server2
Server1
Server2

2 个答案:

答案 0 :(得分:1)

CMD对PowerShell阵列一无所知。您可以将服务器列表作为单独的令牌传递

powershell -File .\script.ps1 Server1 Server2

并在脚本中使用automatic variable $args而不是命名参数:

foreach ($server in $args) {
    ...
}

或者您可以split正文中逗号参数的值:

[CmdletBinding()]
Param(
    [string]$Servers
)

$serverArray = $Servers -split ','

答案 1 :(得分:0)

您可以从命令提示符运行: powershell script.ps1 "Server1,Server2"

如果您在脚本中添加更多参数:

powershell script.ps1 "Server1,Server2" "parameter2 argument" "parameter3 argument"