[英]Passing an array as a parameter in PowerShell
我在使用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
}
我認為這可以歸結為當系統提示您輸入輸入時(通過在命令行上未指定參數的值),其讀取方式與使用Read-Host
cmdlet的方式類似。 該cmdlet的輸出是[System.String]
或[System.Security.SecureString]
。
這樣,它不是一個適當對象的腳本/函數輸入,而是一個長字符串。 如果在param()塊之后向腳本添加調試行,則可以看到區別:
Write-Debug ($Array | Out-String)
在運行腳本之前,需要在控制台上設置$DebugPreference="Continue"
,以查看調試輸出。 運行腳本時,應該看到使用提示輸入的區別。
就個人而言,我將不費勁地從控制台提示符處收集“復雜”數據,並嘗試確保已在命令行中輸入數據的方法,就像您已經嘗試過的那樣。
您需要傳遞這樣的參數:
.\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實際上是設計用來傳遞字符串或字符串數組而不是更復雜的結構的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.