You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在批处理中移除字符串里的首个指定子串?

批处理移除字符串中首个指定子串的问题

需求说明

仅使用批处理(禁止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:35:57