【问题标题】:Use Bat file to split a string with semi-colon as delimiter使用 Bat 文件分割以分号为分隔符的字符串
【发布时间】:2016-06-24 16:13:45
【问题描述】:

我想使用批处理删除一个特殊路径。

我不能使用set somevar=" %path:specialstr=%",因为specialstr 有动态部分。我可以使用批处理从%path%这样的大字符串中删除%cd%产生的字符串吗?

【问题讨论】:

  • 你能提供一个你正在使用的路径的例子吗?和所需的输出?
  • 您是否尝试过使用setlocal EnableDelayedExpansion,然后使用set somevar="!path:%specialstr%!"?这样您就可以在替换中使用变量 specialstr。
  • 欢迎来到 Stack Overflow。请拨打2-minute tour。此外,edit您的问题,请添加minimal reproducible example
  • 很抱歉我的格式不好且无法阅读示例

标签: batch-file path


【解决方案1】:

关注Dennis van Gils' advice,使用Delayed Expansion如下:

SETLOCAL EnableExtensions EnableDelayedExpansion
set "specialstr=%CD%\"
set "somevar=!path:;%specialstr%;=;!"

如果由于某种原因不能使用延迟扩展,请使用call set(阅读Advanced usage : CALLing internal commands):

  • 警告%path% 变量中的某些部分路径包含 facultative 尾随反斜杠,而其他不包含。
  • call set "somevar=%%path:;%specialstr%;=;%%" 最常见的用法。
  • call set "somevar=%%path:;%specialstr%=%%" 如果;%specialstr%%path% 的尾随部分,但注意 Variable Edit/Replace 贪婪 并替换所有出现 ;%specialstr% in %path%
  • 如果%specialstr%;%path% 的前导部分,则使用call set "somevar=%%path:%specialstr%;=%%",但小心同样小心

一个示例脚本:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
where p.bat
pushd "C:\Utils"
set "specialstr=%CD%\"
popd
echo  specialstr=%specialstr%
echo    path end=...%path:~-46%
call set "somevar=%%path:;%specialstr%=%%"       
echo somevar end=...%somevar:~-36%
SETLOCAL
    set "path=%somevar%" 
    echo    path end=...%path:~-36%
    where p.bat
ENDLOCAL
where p.bat

输出(仅显示%path%%somevar% 变量的一些尾随字符以提高可读性):

==> D:\bat\SO\38017804.bat
C:\Utils\p.bat
 specialstr=C:\Utils\
   path end=...Microsoft SQL Server\120\Tools\Binn\;C:\Utils\
somevar end=...Microsoft SQL Server\120\Tools\Binn\
   path end=...Microsoft SQL Server\120\Tools\Binn\
INFO: Could not find files for the given pattern(s).
C:\Utils\p.bat

【讨论】:

  • 我建议将set "specialstr=%CD%\"改为if "%CD:~-1%" == "\" ( set "specialstr=%CD%" ) else ( set "specialstr=%CD%\" ),因为环境变量CD的目录路径没有反斜杠除了当前目录是驱动器的根目录,在这种情况下,CD 的路径已经以反斜杠结尾。
  • @Mofi 你是对的。我同意我的代码不是防弹。这只是一个示例,在这种特殊情况下,bullet-proofness 不是我的目标。请注意所有警告注意小心……OQ 有点不清楚……
猜你喜欢
  • 1970-01-01
  • 2013-05-03
  • 2021-06-12
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多