batch script替换string中的变量字符串

时间:2012-08-12 18:14:40

标签: windows batch-file

我该如何删除 //从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=%

2 个答案:

答案 0 :(得分:5)

一个快速而肮脏的解决方案,只要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

答案 1 :(得分:4)

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

  

FOO \嘘声\杆

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%