相对于批处理文件内部,是否有一种方法可以在命令提示符下进行字符串替换?
背景知识:前段时间,我需要注册一个自定义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的所有尝试都没有成功。很高兴听到或读到这根本不可能,所以我可以停止转动车轮。
答案 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