我正在使用中給出的技術的稍微修改版本這個答案在 Windows 檔案總管中建立一個上下文選單項,讓我可以針對特定資料夾執行 PowerShell 腳本。
該指令如下圖所示:
cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \"%1\" | clip"
除非資料夾名稱中包含與號 (&),否則此操作正常。然後我收到以下錯誤(目標資料夾名為Testing & Testing
):
The string starting:
At line:1 char:37
+ C:\PowerShellScript\folder_script.ps1 <<<< "E:\tmp\Testing
is missing the terminator: ".
At line:1 char:53
+ E:\Dropbox\PowerShell\namefixer.ps1 "E:\tmp\Testing <<<<
+ CategoryInfo : ParserError: (E:\tmp\Testing :String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
顯然有些東西將&符號解釋為特殊字符,但我不知道如何解決這個問題。從資料夾名稱中刪除&符號對我來說不是一個可行的解決方案。
不涉及批次腳本的解決方案將是首選。
我使用 Windows 7 Enterprise(64 位元)和 PowerShell 2。
答案1
您可以使用逐字標記的 Powershell : --%
,它告訴 Powershell 不應解釋其後面的任何內容。
這樣,您的命令將變為:
cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 --% \"%1\" | clip"
除非你的檔案名稱中有雙引號,否則應該沒問題。
此標記是 Powershell 3.0 中的新增內容,因此請確保您已將其更新為最新。
答案2
您可以嘗試修改您的PowerShell腳本。並將命令列更改為批次檔...
您的批次(runner.cmd)
set ps_arg="%~1"
@cd /d %~dp0
PowerShell "folder_script.ps1 | clip"
第二行表示將 runner.cmd 檔案所在的資料夾設定為目前資料夾,以便您可以在沒有完整路徑的情況下執行 PowerShell 腳本。由於無需編輯 runner.cmd 文件,因此可以更輕鬆地移動內容。
並透過腳本中的以下內容存取您的路徑:
$value = $env:ps_arg -replace """",""
批次檔中的引號似乎被傳遞到 PowerShell 腳本並需要被刪除,因此-replace """",""
.由於雙引號在 Windows 檔案名稱中是非法的,因此這永遠不會刪除任何重要的內容。
所以,命令列將是
cmd /K runner.cmd "%1"
答案3
這是一個引用問題。將轉義的雙引號替換為轉義的單引號,以便您的命令如下所示:
cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \'%1\' | clip"
您正在使用兩個不同的程式(cmd 和 powershell)並執行三個不同的可以接受參數的程式碼片段(cmd、powershell 和 .ps1 腳本)。
cmd 需要三個參數:/K Powershell 和 powershell 的參數。 powershell 的參數必須是一個字串,這就是它們位於引號內的原因。
Powershell 需要一個參數:您要執行的命令列。
.ps1 腳本需要一個參數:要執行的資料夾。 Powershell 需要將路徑解釋為單一字串,因此需要用引號引起來。
當您執行該命令時,cmd 會啟動 Powershell 並向其發送帶有引號的字串,其中變數已展開,並且不帶引號或轉義字元:C:\PowerShellScript\folder_script.ps1 "Testing & Testing" | clip
引號確保腳本看到一個參數而不是三個。
(我不確定為什麼不同類型的引號會產生不同的結果(據我所知,它們不應該有),但是當我測試時它們確實如此,所以我提供了適用於我的系統的解決方案。如果您可以提供更多詳細信息,我也許能夠想出一個也適合您的解決方案。