Подстановка строк с использованием переменных в синтаксисе пакета FOR l oop - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь использовать подстановку строк для усечения списка полных путей к файлам до относительных путей в существующем текстовом файле. Кроме того, есть автоматическое переименование некоторых базовых 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%
)

1 Ответ

1 голос
/ 20 февраля 2020
  1. Как @Squashman указал в комментариях, вы не можете "установить" переменную FOR.
  2. Если ваша переменная косвенно зависит от других переменных, вам нужно использовать CALL SET или отложено расширение.

Самое простое решение на данный момент:

(for /F "usebackq tokens=8* delims=\" %%x in (%List%) do echo \%%y) > %List_Final%

Он использует \ в качестве разделителя и передает 8 + -ые аргументы в %%y и перенаправляет весь вывод до %List_Final%
Протестировано на Windows 10 ноутбуке, отлично работает.

...