[英]`Start-Process PowerShell` with -ArgumentList of type command does not invoke command
[英]How I do invoke a PowerShell Start-Process command with arguments that require quoting from a Command Prompt / batch file?
有人可以幫我弄清楚為什么會這樣嗎?
Start-Process
cmdlet的-FilePath
參數本身需要可執行文件的名稱或路徑,而不是整個命令行 。
的參數傳遞給通過指定的可執行-FilePath
必須分別通過,作為陣列 ,經由-ArgumentList
( -Args
)參數。
從cmd.exe
(批處理文件)進行調用時,從概念上講,更干凈的方法是將整個命令行(由PowerShell進行評估)傳遞給單個"
封閉”參數:
powershell.exe -Command "Start-Process -Verb RunAs -FilePath attrib.exe -Args +h, +s, '\"%CD%\"'"
請注意,需要將%CD%
值加倍轉義,首先為了PowerShell,將其括在'
中,然后在\\"
中將其括起來:外部'
確保PowerShell本身將值識別為單個參數,並嵌入\\"
引用確保了最終目標程序, attrib.exe
,認為該值作為一個參數太。
不需要完全限定attrib.exe的路徑,它本身可以通過DOS和PoSH環境變量獲得。
powershell attrib 'd:\temp\SomeFile.txt'
# A D:\temp\SomeFile.txt
powershell attrib +r 'd:\temp\SomeFile.txt'
powershell attrib 'd:\temp\SomeFile.txt'
# A R D:\temp\SomeFile.txt
任何帶有空格的字符串都必須用引號和參數括起來,或者必須分別傳遞。
Start-Process powershell -ArgumentList "-NoExit","-Command &{ $ConsoleCommand }" -Wait
在您的用例以及我所展示的內容中,您正在做的所有事情就是調用PoSH來運行DOS命令,而您只能在DOS中執行該命令。 那么,為什么要使用PoSH而不是runas呢?
此外,當您按照他們嘗試的方式執行命令時,正確引用以正確限定要運行的命令可能會造成混淆。 那條線的真正問題是什么。 傳遞參數必須正確完成,如果不正確處理空格將導致問題,因此會導致錯誤。
另外,為什么要為此從cmd.exe開始,而最終要通過外殼安裝到PoSH控制台主機來運行此命令呢?
只需在PoSH控制台主機中本地執行此操作,這自然就是您在做什么。 為自己節省額外的步驟和復雜性。
只需啟動powershellexe而不是cmd.exe並運行DOS命令即可。
attrib +r 'd:\temp\SomeFile.txt'
PoSH控制台無法完成cmd.exe的工作,而PoSH(控制台主機和ISE)可以執行cmd.exe不能做的很多事情。 那么,為什么不直接從本地開始並留在PoSH?
您可以在本地運行PoSH控制台主機中的所有DOS命令(在ISE中,需要花更多的精力才能使它們工作),或僅使用等效的PoSH。
使用PowerShell Cmdlet處理文件屬性---'blogs.technet.microsoft.com/heyscriptingguy/2011/01/26/use-a-powershell-cmdlet-to-work-with-file-attributes'
我知道那顆牙齒有點長。 但是,您也可以執行以下操作來獲取屬性,並使用類似但不同的cmdlet對其進行修改。
(Get-ChildItem -Path 'D:\Temp\SomeFile.txt').Attributes
# ReadOnly, Archive
# or this
(gci 'D:\Temp\SomeFile.txt').Attributes
# or this
(dir 'D:\Temp\SomeFile.txt').Attributes
# or this
(ls 'D:\Temp\SomeFile.txt').Attributes
上面的每一項都做完全相同的事情。 設置屬性就是這樣...
Set-ItemProperty -Path 'D:\Temp\SomeFile.txt'-Name IsReadOnly -Value $false
# or
sp 'D:\Temp\SomeFile.txt' IsReadOnly $false
(ls 'D:\Temp\SomeFile.txt').Attributes
# Archive
確保可以使用.bat調用PoSH腳本文件。 但是,如果您只是坐在航站樓,則根據需要選擇一個或另一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.