透過資源管理器上下文功能表對名稱中包含「&」符號的項目執行 PowerShell 腳本

透過資源管理器上下文功能表對名稱中包含「&」符號的項目執行 PowerShell 腳本

我正在使用中給出的技術的稍微修改版本這個答案在 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

引號確保腳本看到一個參數而不是三個。

(我不確定為什麼不同類型的引號會產生不同的結果(據我所知,它們不應該有),但是當我測試時它們確實如此,所以我提供了適用於我的系統的解決方案。如果您可以提供更多詳細信息,我也許能夠想出一個也適合您的解決方案。

相關內容