2017-09-11 74 views
3

This questionthis blog post解決了如何將特定參數從批處理文件傳遞到PowerShell腳本中。從具有所有參數的批處理文件調用PowerShell腳本

如何將所有參數傳遞到PowerShell腳本中?基本上我想濺出所有的參數,以便批處理文件透明地傳遞所有參數。

編輯更多的背景:我目前使用的電話線像

PowerShell.exe -Command "& '%~dpn0.ps1' '%1' '%2'" 

這工作,但創建的文件之間的冗餘,從而,如果我更新的PowerShell腳本要採取不同的論點,我也必須更新批處理腳本。什麼是好的是,如果我可以這樣做:

PowerShell.exe -Command "& '%~dpn0.ps1' '%*'" 
+0

你能提供一個你想要的例子嗎? 'Cmd'不像'PSv3' +那樣具有濺射。 – TheIncorrigible1

+0

@ TheIncorrigible1我目前使用的命令如'PowerShell.exe -Command'&'%〜dpn0.ps1''%1''%2'「';我希望能夠通過所有參數而不必枚舉它們。 – jtpereyda

+0

我不確定這是否可行或如何,但是如果您執行了下面的操作,那麼執行「PowerShell.exe -Command」&'%〜dpn0.ps1''%*'「' – jtpereyda

回答

5

嘗試以下操作:

powershell -File "%~dpn0.ps1" %* 
  • 在批處理文件,%*代表傳遞的所有參數。 [1]

  • -File是參數使用通過PowerShell的CLI來調用腳本。然後

  • 所有其餘的參數都穿過作爲原樣(而-Command將它們經受由PowerShell的另一輪解釋的[2] )。

[1]注意,對於cmd.exe(批處理文件)來識別帶有嵌入空白的參數作爲單個參數,則必須將其括在"..."
例如,如果您想將參數ab c傳遞到批處理文件file.cmd,則必須將其稱爲
file a "b c"
要通過嵌入"實例,\ -escape them;例如,"\"b c\""使PowerShell看到"b c",包括雙引號。
如果您遵守這些規則,%* - 無需引用 - 可正確傳遞參數數組。
不是使用"%*" - 它不會按預期工作。

[2]實際上,-Command會導致所有下列參數由每個單個空格被接合,然後將結果字符串被解釋作爲PowerShell命令 - 也就是說,參數被解析後按照cmd.exe(批處理文件)的規則,它們受PowerShell的另一個解析的影響。
不幸的是,PowerShell一直以這種方式工作,但行爲是模糊的,並且可能會導致Unix世界更混亂,現在PowerShell已經跨平臺了 - 請參閱this GitHub issue

+0

這將錯過傳遞給它們的參數。 '%*'將從字面上轉儲所有參數。 – TheIncorrigible1

+0

@ TheIncorrigible1:否:如果您正確地將它們傳遞給批處理文件,它們會完整地傳遞。 – mklement0

+0

假設你將它們傳遞給引號。在他的例子中,他是故意引用它們的,所以可以安全地假設它們沒有被這樣通過,或者他只是過於明確 – TheIncorrigible1

相關問題