【问题标题】:How to do a string replacement on a variable at the windows command prompt?如何在 Windows 命令提示符下对变量进行字符串替换?
【发布时间】:2019-05-27 15:29:31
【问题描述】:

有没有办法在命令提示符下进行字符串替换,而不是在批处理文件中?

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

Windows 注册表编辑器版本 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CNX]
@="Chrome HTML 文档"
"网址协议"=""

[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 (如果 \"%%a#%%b%%c\"==\"%1\" (chrome.exe %1) 否则 (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

命令执行时。

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

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

【问题讨论】:

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


    【解决方案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 的情况一样。如果在以( 开头并以匹配) 结尾的命令块中定义或修改了环境变量,因为cmd.exe 会解析整个命令块并用当前引用值替换所有%variable% 引用在执行此命令块的任何命令之前或在同一命令行上离开命令块开始之前的环境变量。

    另见How does the Windows Command Interpreter (CMD.EXE) parse scripts?

    启用延迟扩展后,需要使用!variable! 引用环境变量以延迟扩展此引用。

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

    带有(几乎)相同代码的注释批处理文件将是:

    @echo off
    rem Explicitly enable command extensions although enabled by default
    rem and delayed environment variable expansion disabled by default.
    setlocal EnableExtensions EnableDelayedExpansion
    
    rem Change current directory to directory containing Google Chrome browser.
    cd /D "%ProgramFiles(x86)%\Google\Chrome\Application\"
    
    rem Define environment variable url with value of first
    rem argument with surrounding double quotes removed.
    set "url=%~1"
    
    rem Exit batch file if called without any argument or with just "".
    if not defined url goto EndBatch
    
    rem Remove case-insensitive all occurrences of string "cnx://"
    rem with an additional percent encoded space from the url argument.
    set "url=!url:cnx://%%20=!"
    
    rem Remove case-insensitive all occurrences of string "cnx://".
    set "url=!url:cnx://=!"
    
    rem Split up the url strings on question mark and hash and assign just
    rem first three ?# delimited substrings to loop variables a, b and c.
    rem FOR would not run any command in command block on url starting with
    rem a semicolon. Run Google Chrome with the url if first substring with #
    rem and the two other substrings appended is case-sensitive equal the url.
    rem Otherwise run Google Chrome with redefined url with second and third
    rem substring exchanged after first substring and hash character.
    for /F "tokens=1-3 delims=?#" %%a in ("!url!") do (
        if "%%a#%%b%%c" == "!url!" (
            start "" chrome.exe "!url!"
        ) else (
            start "" chrome.exe "%%a#%%c%%b"
        )
    )
    
    rem Restore initial environment on calling the batch file which means
    rem discarding all environment variables defined or modified in block
    rem above like environment variable url, restore initial current directory
    rem as it was before using command CD and restore also initial states of
    rem command extensions (most likely enabled) and delayed expansion (most
    rem likely disabled).
    :EndBatch
    endlocal
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 2014-12-18
      • 2023-03-20
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多