首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FOR循环批处理语法中使用变量的字符串替换

在FOR循环批处理语法中使用变量的字符串替换
EN

Stack Overflow用户
提问于 2020-02-19 18:45:57
回答 1查看 182关注 0票数 0

我试图使用字符串替换来截断完整文件路径的列表,直到现有文本文件中的相对路径。此外,还有一些基本的自动重命名。重命名按预期工作,但字符串替换无法工作。我可以找到的描述字符串替换的所有文档都使用独立字符串,而不是存储在变量中的字符串。所以我不知道,也不知道正确的语法。我还阅读了这里提出的类似问题,并试图解决这些问题,但没有结果。

我的脚本中的所有内容都按照预期工作,除了这一行:SET %%I=%%%I:%Temp_Dir%=%

它根本不改变%%I。FOR循环%List%的输入是一个文本文件,如下所示:

代码语言:javascript
复制
C:\Users\UserName\AppData\Local\Temp\Batch_Renaming_Temp\Working\out\bin\codesegment.o
C:\Users\UserName\AppData\Local\Temp\Batch_Renaming_Temp\Working\out\bin\graphic.o
C:\Users\UserName\AppData\Local\Temp\Batch_Renaming_Temp\Working\out\bin\helper.o
C:\Users\UserName\AppData\Local\Temp\Batch_Renaming_Temp\Working\out\bin\main.o
C:\Users\UserName\AppData\Local\Temp\Batch_Renaming_Temp\Working\out\bin\game.out
C:\Users\UserName\AppData\Local\Temp\Batch_Renaming_Temp\Working\out\bin
C:\Users\UserName\AppData\Local\Temp\Batch_Renaming_Temp\Working\out

我现在得到的最后输出与上面的列表相同。所需的输出应该如下所示:

代码语言:javascript
复制
\out\bin\codesegment.o
\out\bin\graphic.o
\out\bin\helper.o
\out\bin\main.o
\out\bin\game.out
\out\bin
\out

我知道语法应该是:

代码语言:javascript
复制
SET string = C:\Users\UserName\AppData\Local\Temp\Batch_Renaming_Temp\Working\out\bin\codesegment.o
SET string = %string:C:\Users\UserName\AppData\Local\Temp\Batch_Renaming_Temp\Working =% 

不过,正如我所说的,我无法使用FOR循环中的变量使其工作。我也在尝试这种字符串替换方法,因为%Temp_Dir%的路径总是在每一行的开头,并且总是在每一行中找到一次。

这是供参考的整个脚本。我更喜欢像我尝试的那样的单行解决方案。我知道更长的解决方案是可用的,但由于我无法控制的原因,单行字符串替换是必需的。

代码语言:javascript
复制
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET Proj_Dir="C:\Users\UserName\Desktop\Project"
SET Temp_Dir=%temp%\Batch_Renaming_Temp\Working
SET Counter=1
SET List="%temp%\Batch_Renaming_Temp\LFN_LIST.TMP"
SET List_Final="%temp%\Batch_Renaming_Temp\LFN_LIST.TXT"

ROBOCOPY /E /MIR %Proj_Dir% "%Temp_Dir%" > NUL
CD "%Temp_Dir%"
DIR /A-D /O:N /B /S > %List%
DIR /AD /O:N /B /S | SORT /R >> %List%
TYPE NUL > %List_Final%

FOR /F "usebackq tokens=* delims=" %%I IN (%List%) DO (
    REN "%%I" !Counter!
    SET /A !Counter+=1
    SET %%I=%%%I:%Temp_Dir%=%
    ECHO %%I >> %List_Final%
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-20 00:52:40

  1. 类似@Squashman在注释中指出,您不能“设置”FOR变量。如果变量间接依赖于其他变量,则需要使用CALL SET或延迟展开。

迄今为止最简单的解决办法是:

代码语言:javascript
复制
(for /F "usebackq tokens=8* delims=\" %%x in (%List%) do echo \%%y) > %List_Final%

它使用\作为分隔符,将8+th参数传递给%%y,并将所有输出重定向到%List_Final%

在Windows 10笔记本电脑上进行测试,效果非常好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60307246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档