Я пытаюсь использовать подстановку строк для усечения списка полных путей к файлам до относительных путей в существующем текстовом файле. Кроме того, есть автоматическое переименование некоторых базовых c. Переименование работает так, как задумано, но подстановка строк не может работать. Вся документация, которую я мог найти, описывающая подстановку строк, использовала отдельные строки, а не строки, хранящиеся в переменных. Поэтому я не знаю и не могу понять правильный синтаксис. Я также читал подобные вопросы, задаваемые здесь, и пытался найти эти решения безрезультатно.
Все в моем сценарии работает, как и предполагалось, за исключением этой строки: SET %%I=%%%I:%Temp_Dir%=%
Это не меняет %%I
совсем. Вход для FOR l oop %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 =%
Как я уже сказал, я не могу заставить его работать с использованием переменных в ЗА 1 oop. Я также пытаюсь использовать этот метод подстановки строк, потому что путь %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%
)