通过资源管理器上下文菜单对名称中包含“&”符号的项目执行 PowerShell 脚本

Kri*_*ris 5 powershell

我正在使用此答案中给出的技术的稍微修改版本来在 Windows 文件资源管理器中创建一个上下文菜单项,该项目允许我针对特定文件夹运行 PowerShell 脚本。

该命令如下所示:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \"%1\" | clip" 
Run Code Online (Sandbox Code Playgroud)

除非文件夹名称中包含与号 (&),否则此操作正常。然后我收到以下错误(目标文件夹名为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
Run Code Online (Sandbox Code Playgroud)

显然有些东西将&符号解释为特殊字符,但我不知道如何解决这个问题。从文件夹名称中删除&符号对我来说不是一个可行的解决方案。

不涉及批处理脚本的解决方案将是首选。

我使用 Windows 7 Enterprise(64 位)和 PowerShell 2。

Max*_*mus 2

您可以尝试修改您的PowerShell脚本。并将命令行更改为批处理文件...

您的批处理(runner.cmd)

set ps_arg="%~1"
@cd /d %~dp0
PowerShell "folder_script.ps1 | clip"
Run Code Online (Sandbox Code Playgroud)

第二行表示将 runner.cmd 文件所在的文件夹设置为当前文件夹,以便您可以在没有完整路径的情况下运行 PowerShell 脚本。由于无需编辑 runner.cmd 文件,因此可以更轻松地移动内容。

并通过脚本中的以下内容访问您的路径:

$value = $env:ps_arg -replace """",""
Run Code Online (Sandbox Code Playgroud)

批处理文件中的引号似乎被传递到 PowerShell 脚本并需要被删除,因此-replace """","". 由于双引号在 Windows 文件名中是非法的,因此这永远不会删除任何重要的内容。

所以,命令行将是

cmd /K runner.cmd "%1"
Run Code Online (Sandbox Code Playgroud)