簡體   English   中英

如何使用需要從命令提示符/批處理文件中引用的參數來調用PowerShell Start-Process命令?

[英]How I do invoke a PowerShell Start-Process command with arguments that require quoting from a Command Prompt / batch file?

PowerShell嘗試執行exec命令時出現此錯誤:

我正在嘗試exec以下命令:

powershell.exe Start-Process -FilePath "C:\Windows\System32\attrib +h +s "%CD%"" -Verb runAs

有人可以幫我弄清楚為什么會這樣以及如何解決嗎?

有人可以幫我弄清楚為什么會這樣嗎?

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 ,認為該值作為一個參數太。

不幸的是, 這種雙重轉義的需求是不幸的,並且不是必須的-在GitHub問題對此進行了討論。

不需要完全限定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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM