2009-08-15 67 views
5

在Windows PowerShell中,我試圖在一個字符串中存儲一個移動命令,然後執行它。有人能告訴我爲什麼這不起作用嗎?爲什麼我不能使用powershell中的字符串參數執行commandlet?

PS C:\Temp\> dir 
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Temp 

Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---   8/14/2009 8:05 PM  2596 sa.csproj 
-a---   8/15/2009 10:42 AM   0 test.ps1 


PS C:\Temp> $str = "mv sa.csproj sb.csproj" 
PS C:\Temp> &$str 
The term 'mv sa.csproj sb.csproj' is not recognized as a cmdlet, function, operable program, or script file. Verify the 
term and try again. 
At line:1 char:2 
+ &$ <<<< str 
PS C:\Temp> 

當存儲帶參數的任何命令時,出現此錯誤。我如何克服這個限制?

回答

10

從幫助(about_Operators):

 
& Call operator 
    Description: Runs a command, script, or script block. Because the call 
    operator does not parse, it cannot interpret command parameters.

您可以使用腳本塊而不是字符串:

$s = { mv sa.csproj sb.csproj } 
& $s 

或者你可以使用Invoke-Expression

Invoke-Expression $str 

iex $str 

相反&Invoke-Expression確實解析字符串的內容,所以你可以把任何東西在裏面,不只是一個單一的命令。

+0

感謝另一個很好的選擇,你覺得你能解釋(或連結)什麼樣的性格和做一個解釋? – 2009-08-15 18:36:23

+2

'&'用於執行單個命令,腳本或腳本塊,就像幫助狀態一樣。它不執行任何解析,因此它只接受一個參數,然後假定它是一個可調用的命令。如果要添加參數,則可以將調用包裝在腳本或腳本塊中,或者使用「Invoke-Expression」。您可以通過在Powershell中輸入'help about_operators'來找到描述操作員的幫助頁面。 – Joey 2009-08-15 18:39:42

5

約翰內斯的所有建議都很明顯,但我想讓人們知道在V2中還有另一種選擇。你把命令字符串像以前一樣,但你把參數在哈希表中,並使用&例如爲:

$cmd = 'mv' 
$params = @{Path = 'log.txt'; Destination = 'log.bak'} 
&$cmd @params 

它使用稱爲潑灑新V2功能調用。這就像使用命令的響應文件一樣,但是您將參數放在散列表中而不是文件中。

注意:你也可以把參數數組將在參數「的位置」插件,而不是由名稱,如:

$cmd = "cpi" 
$params = ('log.txt', 'log.bak') 
&$cmd @params 

它可能不完全符合OP的問題,但它是一個值得了解的訣竅。

2

我不得不回答一個類似的問題而回,約建立的參數列表後調用外部程序:

經過,它看起來像使用. $program $argString& $program $argString如果$argString包含多個參數不起作用。 .&運營商只是進行直接呼叫,將整個$argString作爲單個參數傳遞。

而不是使用[string]$argString和做$argString += "-aaa `"b b b`""的,你可以將其更改爲[string[]]$argArray和使用$argArray += @('-aaa', 'b b b'),這將工作,並根據需要將自動跳脫字符串。您可以使用$process = [Diagnostics.Process]::Start($program, $argString)。這將更容易跟蹤執行進度,但難以檢索任何文本輸出。

或者你可以把所有內容放在一個字符串中並使用Invoke-Expression "$program $argString",它將把整個字符串解析爲命令並正確執行。

如前所述Keith,潑灑在PowerShell中2