在PowerShell

时间:2016-10-28 12:04:39

标签: arrays powershell dictionary

我在使用Powershell时遇到了一些麻烦,我的代码看起来像这样:

param
(
    [Parameter(Mandatory=$true)]
    $Array = ''
)

foreach ($member in $Array){
    Write-Host "TEST"

    $server = $member["server"]
    $path = $member["path"]
    $key = $member["key"]

    Write-Host $server
    Write-Host $path
    Write-Host $key
}

当我提供以下行作为输入时,脚本只打印“TEST”而不打印,但是当我在脚本本身中用完全相同的代码定义$Array时,脚本按预期工作。

@(@{"server" = "server1"; "path" = "\\path1"; "key" = "key1"}, @{"server" = "server2"; "path" = "\\path2"; "key" = "key2"}, @{"server" = "server3"; "path" = "\\path3"; "key" = "key3"})

预期输出为:

TEST
server1
\\path1
key1
TEST
server2
\\path2
key2
TEST
server3
\\path3
key3

这是我第一次使用Python背景进入PowerShell。

似乎如果在命令行级别传递此数组,它就可以工作。但是,如果脚本提示输入并在该点输入,则会失败。 我哪里错了?

为了澄清,下面的代码非常有效,每个键的值都打印到控制台。

$Array = @(@{"server" = "server1"; "path" = "\\path1"; "key" = "key1"}, @{"server" = "server2"; "path" = "\\path2"; "key" = "key2"}, @{"server" = "server3"; "path" = "\\path3"; "key" = "key3"})

foreach ($member in $Array){
    Write-Host "TEST"

    $server = $member["server"]
    $path = $member["path"]
    $key = $member["key"]

    Write-Host $server
    Write-Host $path
    Write-Host $key
}

2 个答案:

答案 0 :(得分:1)

我认为这归结为当提示您输入时(通过不在命令行上指定参数的值),它的读取方式与使用Read-Host cmdlet的方式类似。该cmdlet的输出为[System.String][System.Security.SecureString]

因此,代替脚本/函数的输入是适当的对象,它只是一个长字符串。如果在param()块之后向脚本添加调试行,则可以看到差异:

Write-Debug ($Array | Out-String)

在运行脚本之前,您需要在控制台上设置$DebugPreference="Continue"以查看调试输出。运行脚本时,您应该看到它使用提示输入所产生的差异。

就个人而言,我不会更加努力地从控制台提示中收集“复杂”数据,并查看确保在命令行中输入数据的方法,就像您已经尝试过的那样。

答案 1 :(得分:0)

您需要传递如下参数:

.\1.ps1 @(@{"server" = "server1"; "path" = "\\path1"; "key" = "key1"}, @{"server" = "server2"; "path" = "\\path2"; "key" = "key2"}, @{"server" = "server3"; "path" = "\\path3"; "key" = "key3"})

当您使用ISE时,该参数将作为字符串处理,因为您实际传递了一个字符串,并且未对其应用PowerShell语法。您可以通过在脚本中添加$Array.GetType().Name来验证它。

如果您要正确定义变量,这有点帮助:

[System.Collections.Generic.Dictionary``2[System.String,System.String][]] Array

但UI实际上是为了传递字符串或字符串数​​组而不是更复杂的结构。