在PowerShell中将数组作为参数传递

3

我遇到了一些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
无法复现。你使用的是哪个版本的PowerShell?如果不确定,请检查$PSVersionTable['PSVersion'] - Mathias R. Jessen
我正在使用 Powershell 4.0 - AidenWebb
我正在使用F5在ISE中运行这个程序。然后它会提示输入参数。 然后我将"$Array = "之后的所有内容复制粘贴到提示框中。 - AidenWebb
安德烈,这很奇怪,它能在某些地方运行,但在ISE中无法运行。 有没有办法让它在ISE中工作? - AidenWebb
可能重复的问题 https://dev59.com/wWUp5IYBdhLWcg3wrY9p - Esperento57
显示剩余3条评论
2个回答

4

我认为这归结于当您被提示输入(未在命令行上指定参数值)时,它会以类似于使用Read-Host cmdlet的方式进行读取。该cmdlet的输出要么是[System.String],要么是[System.Security.SecureString]

因此,脚本/函数的输入不是一个正确的对象,而只是一个长字符串。如果您在param()块后面添加一个调试行,就可以看到差异:

Write-Debug ($Array | Out-String)

您需要在运行脚本之前,在控制台上设置$DebugPreference="Continue",以查看调试输出。当您运行脚本时,您应该可以看到使用提示输入所做的差异。 个人而言,我不会尝试从控制台提示中收集“复杂”的数据,并寻找确保在命令行中提供数据的方法,因为您已经尝试过了。

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的设计确实是为了传递字符串或字符串数组,而不是更复杂的结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接