2016-03-22 97 views
2

假設我們有以下SwitchTest.ps腳本使用PowerShell的調用(&)運算符來調用PowerShell腳本與開關參數

param(
    [switch]$Flag = $false 
) 

echo "Flag: $Flag" 

預期以下工作:

& ".\SwitchTest.ps1" -Flag 
Flag: True 

儘管如此,這並不

& ".\SwitchTest.ps1" "-Flag" 
Flag: False 

此外,如果我們將SwitchTest.ps修改爲是這樣的:

param(
    [switch]$Flag = $false, 
    [string]$Str = $null 
) 

echo "Flag: $Flag" 
echo "Str: $Str" 

我們得到這個預期的行爲:

& ".\SwitchTest.ps1" -Flag 
Flag: True 
Str: 

而且這個意外之一:

& ".\SwitchTest.ps1" "-Flag" 
Flag: False 
Str: -Flag 

我試過-Flag true-Flag $true-Flag:$true ...沒有雪茄。看起來開關參數在引用時會被「跳過」(即當它是一個正確的字符串時) - 爲什麼?如果我想以編程方式構建"-Flag",我該怎麼辦?

+2

一個字符串總是一個字符串......如果要執行存儲在一個字符串中的命令,建議使用'iex'作爲@briantist。 –

+0

看看這篇文章是否有助於清除它:[在PowerShell中運行可執行文件](http://windowsitpro.com/powershell/running-executables-powershell)。 –

+1

我覺得來自文檔的這句話是你不想在這裏的:_因爲調用操作符不解析命令,它不能解釋命令參數._我傾向於與Briantist一起。這不是它的目的。爲什麼使用調用操作符時應該只能在調用腳本時忽略它(測試以防萬一)? – Matt

回答

3

請原諒我,如果我是非基地,但如果你想有條件設置該標誌,放棄呼叫運營商,只使用splatting。

PS M:\Scripts> $params = @{Flag=$true;Str="Bagels"} 

PS M:\Scripts> .\switchTest.ps1 @params 
Flag: True 
Str: Bagels 
+0

美麗,即使與呼叫操作員(我喜歡保持,所以我有一致的代碼,無論我是否調用PS腳本或「正常」EXE)splatting工程。 –

1

你看到的行爲正是我所期待的。

如果要以編程方式構建它,請使用Invoke-Expression

+0

我知道'iex'工作,我問爲什麼'&'不,並且如果有任何解決方法。 –

3

您提出了一個很好的問題,並設置了一個非常好的測試用例。讓我們留下沒有參數的標誌,所以它默認爲$ Null。當您自己指定-Flag時,PowerShell將使用開關參數。但是,PowerShell將"-Flag"解釋爲字符串,因此會嘗試查找與字符串變量匹配的參數,並將該字符串(包括-,因爲它用雙引號引起來)傳遞給與[String]類型匹配的參數。最後,由於您向字符串變量發送了字符串"-Flag",因此Flag變量保留爲其默認值$Null$False。很好的問題。

以下是您可以用來測試的代碼。

#Put this in a script file, e.g. ParamTest.ps1 
Flag: False 
Str: -Flag 

param(
    [switch]$Flag, 
    [string]$Str = $null 
) 

Write-Output "Flag: $Flag" 
Write-Output "Str: $Str" 

如同上面一樣執行剛:

& ".\SwitchTest.ps1" "-Flag" 

但現在,你看到PowerShell的分配如何參數傳遞,請嘗試以下觸發Flag參數,你打算原本打算做的事:

& .\ParamScript.ps1 "-Flag" -Flag 
相關問題