如何在Windows命令提示符下对变量进行字符串替换?

时间:2019-05-27 15:29:32

标签: windows batch-file cmd registry batch-processing

相对于批处理文件内部,是否有一种方法可以在命令提示符下进行字符串替换?

背景知识:前段时间,我需要注册一个自定义URI协议,该协议将通过注册表黑客将调用的URL转发到Chrome,结果是:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CNX]
@="Chrome HTML Document"
"URL Protocol"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CNX\DefaultIcon]
@="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe,0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CNX\shell]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CNX\shell\open]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CNX\shell\open\command]
@="cmd /c cd \"C:\\Program Files (x86)\\Google\\Chrome\\Application\\\" & FOR /f \"tokens=1-3delims=?#\" %%a IN (\"%1\") DO (if \"%%a#%%b%%c\"==\"%1\" (chrome.exe %1) else (chrome.exe %%a#%%c%%b) )"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\ProtocolExecute\CNX]
"WarnOnOpen"=dword:00000000

我现在注意到的问题是,通过一些新的Windows更新,以前被称为

cnx:// www.someurl.com
IE中的

现在变成了

cnx://%20www.someurl.com

命令执行时。

因此,我想知道是否有一种方法可以在某个地方进行字符串替换,并从我的cnx://%20变量中完全删除%%a或其他东西?

但是我使用https://ss64.com/nt/syntax-replace.html的所有尝试都没有成功。很高兴听到或读到这根本不可能,所以我可以停止转动车轮。

1 个答案:

答案 0 :(得分:1)

该解决方案正在Window注册表文件中使用:

@="cmd.exe /V:ON /C cd /D \"C:\\Program Files (x86)\\Google\\Chrome\\Application\\\" & set \"url=%1\" & set \"url=!url:cnx://%%20=!\" & set \"url=!url:cnx://=!\" & for /F \"tokens=1-3 delims=?#\" %%a in (\"!url!\") do if \"%%a#%%b%%c\"==\"!url!\" (chrome.exe \"!url!\") else (chrome.exe \"%%a#%%c%%b\")"

这将导致Windows注册表中出现以下命令行:

cmd.exe /V:ON /C cd /D "C:\Program Files (x86)\Google\Chrome\Application\" & set "url=%1" & set "url=!url:cnx://%%20=!" & set "url=!url:cnx://=!" & for /F "tokens=1-3 delims=?#" %%a in ("!url!") do if "%%a#%%b%%c"=="!url!" (chrome.exe "!url!") else (chrome.exe "%%a#%%c%%b")

重要的是Windows命令处理器选项/V:ON,它为环境变量启用delayed expansion,如在命令提示符窗口cmd /?中运行时的帮助输出所述。必须分别将选项/V:ON留给选项/C(在执行命令行后关闭)/K(在命令行执行后保持命令进程运行),因为/C之后的所有内容或/K被解释为要执行的命令行的一部分。

使用/K而不是/C可以看到在执行此命令行时发生了什么,并且set url可以在命令行执行完成后由用户执行,查看环境变量url的最终值是什么。

在cmd窗口set /?中运行时的帮助输出说明何时以及如何使用延迟的环境变量扩展。如果在命令行上定义或修改了环境变量,并且在同一命令行上引用了环境变量,则必须使用该变量,此处使用single line with multiple commands。由于(会解析整个命令块并替换所有{{1 }}在执行此命令块的任何命令之前,或者在同一命令行上的命令块开始处,按引用环境变量的当前值进行引用。

另请参阅How does the Windows Command Interpreter (CMD.EXE) parse scripts?

启用延迟扩展后,必须使用)引用环境变量来扩展此引用。

注意:即使在双引号参数字符串中启用,命令行中的每个感叹号也将被解释为延迟扩展环境变量引用的开始/结束。

带有(几乎)相同代码的批处理批处理文件为:

cmd.exe