如何在批处理中移除字符串里的首个指定子串?
批处理移除字符串中首个指定子串的问题
需求说明
仅使用批处理(禁止PowerShell),实现移除字符串中的首个指定子串(此处为\te\)。
初始测试脚本
@echo off @setlocal enableextensions enabledelayedexpansion set "str=C:\help\te\Windows\Example\001 Example\te\005 Example" echo -----------原始字符串--------------------------- echo !str! echo ----------此操作会移除所有\te\---------------------------- echo !str:\te\=\! echo -----------获取首个\te\之后的所有内容--------------------------- set "strAfter=!str:*\te\=\!" echo !strAfter! echo ----------如何获取首个\te\之前的所有内容?---------------------------- echo how? echo ---------如何直接移除首个\te\?----------------------------- echo how? echo -----------------能否通过首个\te\的位置来实现?------------------------------- echo how? PAUSE
已尝试上述方法及for循环、find、findstr,也曾考虑获取首个\te\的位置再拼接前后内容,但均未成功。
更新1:测试环境下的可行方案
借助技巧实现了测试脚本的正常运行(正在学习双引号、%%、&&和!!的用法):
echo: echo ------ 获取首个\te\之前的内容-------- rem 将首个\te\之后的内容替换为空,再移除\te set "strBefore=!str:%strAfter%=!" set "strBefore=!strBefore:\te=!" echo !strBefore! echo: echo ------ 方法1-------- set "finalstr=!strBefore!!strAfter!" echo !finalStr!
仍希望了解如何自动获取首个子串的位置,示例手动指定索引的方式如下:
echo: echo ----(方法2)-- 通过首个\te\的位置实现-------- echo ------ 若能自动获取索引7就好了 set /a ind=7 set before=!str:~0,%ind%! set after=!str:*\te\=\! set finalstr=!before!!after! echo !finalstr!
同时好奇是否有更简洁的1-2行代码实现移除首个子串的操作?
更新2:实际脚本移植后的问题
测试脚本可用,但移植到处理快捷方式的脚本后失效,实际脚本如下:
@ECHO off @setlocal enabledelayedexpansion REM 查找所有快捷方式文件 For /R %%G in (*.lnk) do ( echo: echo -------------------------------- set originalLink=%%G echo 当前快捷方式 : !originalLink! REM 获取目标路径 for /F "tokens=1 delims=" %%a in ('shortcutJS.bat -examine "%%G" ^| find /i "Target:"') do ( set "targetVar=%%a" ) REM 移除开头的Target:字样(使用双引号处理空格) set "targetVar=!targetVar:Target:=!" echo 目标文件路径 : !targetVar! rem TODO 统计\te\的数量,以便跳过无需处理的情况 REM 移除路径中的首个\te\文件夹 set "strAfter=!targetVar:*\te\=\!" echo 首个\te\之后的内容: !strAfter! REM 将首个\te\之后的内容替换为空,再移除\te set "strBefore=!targetVar:%strAfter%=!" echo strBefore值为: !strBefore! set "strBefore=!strBefore:\te=!" echo strBefore处理后: !strBefore! set "targetNew=!strBefore!!strAfter!" echo 新目标路径 !targetNew! REM 此操作会移除所有\te\...若存在多个则不合适,尝试用上述方法替代。 set targetNew=!targetVar:\te\=\! echo: echo 新目标路径 : !targetNew! REM 实际将新目标路径写入快捷方式... REM editShortcut.vbs "!originalLink!" "!targetNew!" PAUSE )
其中strAfter可正常工作,但strBefore异常,输出示例:
-------------------------------- 当前快捷方式 : C:\Users\carol\Desktop\tests raccourcis names serveur\renameLinks2\horloge velo.jpg.lnk 目标文件路径 : C:\Users\carol\Desktop\tests raccourcis names serveur\te\horloge velo.jpg 首个\te\之后的内容: \horloge velo.jpg strBefore值为: targetVar:= strBefore处理后: targetVar:= 新目标路径 targetVar:=\horloge velo.jpg 新目标路径 : C:\Users\carol\Desktop\tests raccourcis names serveur\horloge velo.jpg 请按任意键继续...
内容的提问来源于stack exchange,提问作者Caro
相关产品推荐
相关产品推荐

