【问题标题】:batch script replace variable string within string批处理脚本替换字符串中的变量字符串
【发布时间】:2012-08-12 18:14:39
【问题描述】:

如何删除 // 从 fullPath 字符串中删除绝对路径字符串

set abs_p=C:\abspath\
set rel_p=C:\abspath\foo\boo\bar

如何从 rel_p 中删除 abs_p? 我没有让语法正常工作

set rel_p=%rel_p:abs_p=%

【问题讨论】:

  • 谢谢,但我的问题是要替换的字符串是一个变量,我没有看到如何在这个命令中指定一个变量,它转义了命令

标签: windows batch-file


【解决方案1】:

只要 abs_p 不包含 =! 就可以工作的快速而肮脏的解决方案

@echo off
setlocal enableDelayedExpansion

set "abs_p=C:\abspath\"
set "rel_p=C:\abspath\foo\boo\bar"

set "rel_p=!rel_p:*%abs_p%=!"
echo relative path = !rel_p!

应该始终有效的快速解决方案。

@echo off
setlocal enableDelayedExpansion

set "abs_p=C:\abspath\"
set "rel_p=C:\abspath\foo\boo\bar"

>temp.txt echo !abs_p!
for %%N in (temp.txt) do set /a len=%%~zN-2
set "rel_p=!rel_p:~%len%!"
del temp.txt

echo relative path = !rel_p!

上面使用了一种粗略但有效的方法来获取绝对路径的字符串长度。有一个更复杂但尖叫得很快的strLen function 可以代替。

【讨论】:

    【解决方案2】:

    对于您的示例输入,此脚本会生成

    foo\boo\bar

    set abs_p=C:\abspath\
    set rel_p=C:\abspath\foo\boo\bar
    
    set newp=
    set rec_a=
    set rec_r=
    
    call :strip  %rel_p%\ %abs_p%
    goto :END
    
    :strip
    set rec_a_part=
    set rec_a=
    set rec_r_part=
    set rec_r=
    
    for /F "tokens=1,* delims=\" %%t  in ("%2") do (
        set rec_a_part=%%t
        set rec_a=%%u
     )
    for /F "tokens=1,* delims=\" %%t  in ("%1") do ( 
      set rec_r_part=%%t
      set rec_r=%%u
    )
    if not !%newp%!==!! set newp=%newp%\
    if not !%rec_a_part%!==!%rec_r_part%! set newp=%newp%%rec_r_part%
    if not !%rec_r%!==!! call :strip  %rec_r% %rec_a%
    goto :EOF
    
    :END
    echo %newp%
    

    【讨论】:

    • 正是我需要的,但该死!有什么办法让它更简单?
    • 更简单?是的,使用 vbscript、wscipt 或 powershell,换句话说:一种体面的编程语言。如果它符合您的需要,请不要忘记将我的答案以及您提出的其他问题的答案标记为正确。
    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 2011-04-08
    相关资源
    最近更新 更多