通过资源管理器上下文菜单对名称中包含“&”符号的项目执行 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

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

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

我正在使用带有 PowerShell 2 的 Windows 7 Enterprise(64 位)。

答案1

您可以使用逐字标记Powershell 的 : --%,它告诉 Powershell 不应解释其后面的任何内容。

这样,你的命令将变成:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 --% \"%1\" | clip" 

除非你的文件名中有双引号,否则应该没问题。

此标记是 Powershell 3.0 中的新标记,因此请确保它是最新的。

答案2

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

您的批次(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

引号确保脚本看到一个参数而不是三个。

(我不确定为什么不同类型的引号会产生不同的结果(据我所知它们不应该有),但在我测试时它们确实产生了不同的结果,所以我提供了在我的系统上有效的解决方案。如果您可以提供更多详细信息,我可能会想出一个也适合您的解决方案。)

相关内容