我在使用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
}
答案 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实际上是为了传递字符串或字符串数组而不是更复杂的结构。