如何在这个混合的 cmd / powershell 代码中转义毒字符?

Posted

技术标签:

【中文标题】如何在这个混合的 cmd / powershell 代码中转义毒字符?【英文标题】:How to escape poison character in this mixed cmd / powershell code? 【发布时间】:2021-11-27 21:31:24 【问题描述】:

我要求第一个解释“here”和“here”但要尝试更复杂的情况,但我无法(经过两个小时的尝试)理解如何解决。我阅读了正则表达式的工作原理,但什么也没有,我进入了舞会。

修改后的代码是这样的:

(Fsutil Dirty Query %SystemDrive%>Nul)||(powershell.exe -c "[Environment]::CommandLine; Start -Verb RunAs cmd /k, ("^""%~f0"^"" -replace '[;,()= &^]', '^$&')" & echo exit)

毒字所在的文件夹是这样的:

C:\Users\fposc\Desktop\Pie & tea % @ ' $^

我试图用 \^ 转义正则表达式中的 ^ 但不起作用。我也用\(和\)逃脱了(和)。但没有任何效果:

(Fsutil Dirty Query %SystemDrive%>Nul)||(powershell.exe -c "[Environment]::CommandLine; Start -Verb RunAs cmd /c, ("^""%~f0"^"" -replace '[;,\(\)= &\^]', '^$&')" & exit)

我添加了圆括号,因为我想放置所有可能的字符以使代码尽可能通用。

我不知道我提出另一个问题是否正确。也许我应该改变原来的问题?由于其他组合是可能的并且不了解机制,我可以提出许多其他类似的问题。你建议我怎么做?

【问题讨论】:

我的建议是放弃 cmd.exe,直接在 PowerShell 中编写整个脚本。 (IMO 的事情会更加一致,更容易理解,也不会令人沮丧。) 假设你的匹配是一个组,而不是一个文字字符串,有几个保留字符应该被转义。我也必须对您的替换字符串进行类似的假设。在我看来,这显然是您没有研究过 -replace 运算符或 RegEx 的情况。在我看来,您应该这样做并做出合理的尝试,确保您的替换命令是正确的,然后再尝试正确地转义它。 【参考方案1】:

问题是您的文件夹名称中存在$,这会导致 PowerShell 命令将其解释为变量引用的开始。

解决方法是使用辅助。环境变量,用于存储批处理文件的完整路径,并让 PowerShell 根据此变量的值执行转义:

:: Unless already elevated, re-invoke this batch file with elevation,
:: via PowerShell.
set "__THISFILE=%~f0"
Fsutil Dirty Query %SystemDrive% >Nul || (powershell.exe -c "Start-Process -Verb RunAs cmd /k, ($env:__THISFILE -replace '[ &%%^]', '^$&')" & exit)

我已更新 the answer to your original question 以合并此方法,它现在展示了一种 - 希望 - 强大的方法来按需重新调用具有高度的批处理文件,包括对参数的支持。

【讨论】:

以上是关于如何在这个混合的 cmd / powershell 代码中转义毒字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过cmd杀死powershell进程?统一远程应用

我如何在 Windows 中使用 cmd/powershell 卸载受密码保护的应用程序 [关闭]

我无法在 CMD 和 powershell 中执行 C 程序

Win10小技巧:如何将在此处打开命令改为CMD或Powershell?

如何通过 powershell 或 cmd 计算屏幕数量

如何编写使用 powershell 而不是 cmd 的控制台应用程序