【问题标题】:CMD / Batch / Registry - String replace not working as expected?CMD / Batch / Registry - 字符串替换没有按预期工作?
【发布时间】:2014-04-28 07:25:30
【问题描述】:

尝试在一行代码中为 Windows 注册表项替换子字符串是最有趣的

[HKEY_CLASSES_ROOT\PING\shell\open\command]
@="C:\\Windows\\System32\\ping.exe %1 -t"

场景和背景:

上下文是一个自定义 url 协议,它将打开一个 shell 并持续 ping 到特定的 ip,我想从作为 %1 传递的 uri 中删除协议 ping://。 当然我可以使用一个批处理文件,但我更希望将它全部放在注册表中的一行中

我的尝试:

到目前为止,我已经尝试使用 & 设置一个 var 然后回显它来附加一个命令列表。

试过call set remove=ping://&call set mynewvar=%1:%remove=%&ping.exe %mynewvar% -t

我尝试使用 %% 扩展变量几次

基本上我得到了奇怪的结果,或者替换根本不起作用

不确定我做错了什么?输入这个,我开始认为我忽略了它在字符串中的事实 var @="..."

谢谢

注册表项

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\PING]
@="url:ping protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\PING\shell]

[HKEY_CLASSES_ROOT\PING\shell\open]

[HKEY_CLASSES_ROOT\PING\shell\open\command]
@="cmd /k set var=%1 & call set var=%%var:ping://=%% & ping.exe %var% -t"

浏览器输入网址 ping://8.8.8.8

cmd提示符输出 Ping request could not find host ping://8.8.8.8/ar. Please check the name and try again.

在 ip 来自 %var% 之后,我注意到 ar 它似乎使用 %v 而不是 %var

【问题讨论】:

    标签: windows shell batch-file cmd registry


    【解决方案1】:

    知道了..%v 实际上是

    %v – For verbs that are none implies all. If there is no parameter passed this is the working directory.

    this answer那里得到的

    工作代码

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\PING]
    @="url:ping protocol"
    "URL Protocol"=""
    
    [HKEY_CLASSES_ROOT\PING\shell]
    
    [HKEY_CLASSES_ROOT\PING\shell\open]
    
    [HKEY_CLASSES_ROOT\PING\shell\open\command]
    @="cmd /k set myvar=%1 & call set myvar=%%myvar:ping:=%% & call set myvar=%%myvar:/=%% & call ping.exe %%myvar%% -t"
    

    【讨论】:

    • 很好,但%var% 也适用于我的 XP 系统,所以%v 似乎不是问题的原因
    • 我只需要删除protocol:,并执行一个非cmd程序,所以我选择了这样的东西:"cmd /k set myvar=%1 & call set myvar=%%myvar:protocol:=%% & call \"C:\\Program Files\\path\\to\\program.exe\" \"%%myvar%%\" & exit"
    【解决方案2】:

    字符串替换只能用变量而不是像%1这样的参数。

    这样的事情可能是一个起点

    set "var=%1" & call var=%%var:ping://=%%
    

    在注册表中它可能看起来像

    ...
    [HKEY_CLASSES_ROOT\PING\shell\open\command]
    @="cmd /k ( set \"var=%1\" & call set var=%%var:ping://=%% & call set var=%%var:/=%% & call ping.exe %%var%% -t)"
    

    【讨论】:

    • 我已经使用cmd /k "set var=%1 & call set var=%%var:ping://=%% & ping.exe %var% -t" 让它在批处理文件中运行,但注册表项没有运气..
    • @StrikeForceZero 您应该显示完整的代码,您用于获取注册表项以及如何尝试修改它
    • 我将其添加到问题中
    猜你喜欢
    • 2019-08-01
    • 2012-10-31
    • 2015-02-22
    • 2012-06-17
    • 2012-04-19
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    相关资源
    最近更新 更多