【发布时间】:2020-06-04 00:42:42
【问题描述】:
我正在尝试使用字符串替换将完整文件路径列表截断为现有文本文件中的相对路径。此外还有一些基本的自动重命名。重命名按预期工作,但字符串替换我无法开始工作。我能找到的所有描述字符串替换的文档都使用了独立的字符串,而不是存储在变量中的字符串。所以我不知道也无法弄清楚正确的语法。我还阅读了此处提出的类似问题,并尝试了这些解决方案,但均无济于事。
我的脚本中的所有内容都按预期工作,除了这一行:
SET %%I=%%%I:%Temp_Dir%=%
它根本不会改变%%I。 FOR 循环 %List% 的输入是一个文本文件,如下所示:
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
我现在得到的最终输出与上面的列表相同。 所需的输出应如下所示:
\out\bin\codesegment.o
\out\bin\graphic.o
\out\bin\helper.o
\out\bin\main.o
\out\bin\game.out
\out\bin
\out
我知道语法应该是:
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% 的路径总是在每一行的开头,并且总是在每一行中找到一次。
这是整个脚本供参考。我更喜欢像我正在尝试的那样的单线解决方案。我知道有更长的解决方案可用,但由于我无法控制的原因,需要进行单行字符串替换。
@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%
)
【问题讨论】:
-
您不能用
FOR变量进行字符串替换。 -
@Squashman 我可以设置一个等于 FOR 变量的临时变量并用它代替吗?
-
1.就像@Squashman 指出的那样,您不能“设置” FOR 变量。
-
2.如果您的变量的内容依赖于其他变量,您需要使用
SETLOCAL ENABLEDELAYEDEXPANSION或call,但在这种情况下根本不需要。 -
@HackingAddict0302 所以我应该这样做:
SET string = %%ICALL SET string = %string:%Temp_Dir%=%或者我想不打电话,因为我已经启用了延迟扩展。
标签: string batch-file replace syntax string-substitution