Используйте этот код для пакетного файла:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceFile=txt1.txt"
set "OutputFile=txt2.txt"
set "LineNumber=0"
(
for /F usebackq^ delims^=^ eol^= %%I in ("%SourceFile%") do (
set "Line=%%I"
set /A LineNumber+=1
setlocal EnableDelayedExpansion
echo set TRACK!LineNumber!=!Line:.mp3=!
endlocal
)
) >"%OutputFile%"
endlocal
Для объяснения цикла FOR см. Мой ответ на Как читать и печатать содержимое строки текстового файлаby line? Пустые строки в исходном файле игнорируются FOR , что не должно вызывать проблем, так как похоже, что исходный файл содержит список имен файлов MP3.
Вопросне содержит пример содержимого исходного файла и пример ожидаемого содержимого выходного файла.Таким образом, код был протестирован с исходным файлом, созданным мной, который представляет собой строки, размещенные в Как читать и печатать содержимое текстового файла построчно? с некоторыми строками с добавлением .mp3
и одной строкой с^
добавлено.
Если все строки заканчиваются на .mp3
, было бы лучше использовать:
echo set TRACK!LineNumber!=!Line:~0,-4!
В этом случае строка, считанная из файла, выводится без последних четырех символов.
Важно включить отложенное расширение NOT при назначении чтения строки из файла переменной среды Line
.В противном случае эта строка анализируется cmd.exe
во второй раз, как объясняется Как интерпретатор сценариев командных интерпретаторов Windows (CMD.EXE) анализирует? При повторном разборе SET LINE=%%I
каждая ^
в строке, считанной изфайл интерпретируется как escape-символ, а каждый !
интерпретируется как начало / конец ссылки на переменную окружения.
По этой причине необходимо сначала присвоить строку, считанную из файла, переменной окружения Line
, в то время какотложенное расширение отключено, чтобы избежать анализа строки перед выполнением команды SET командным процессором Windows.Затем включается отложенное расширение переменных среды, в результате чего создается копия текущего списка переменных среды, помещается текущий путь к каталогу в стеке, а также текущие состояния расширений команд и отложенное расширение переменных среды в стеке перед включением также отложенного расширения.Затем строка может быть выведена с дополнительным текстом, начинающимся с номера строки и без учета регистра, удаляя все вхождения .mp3
из строки.И, наконец, команда ENDLOCAL должна использоваться, чтобы отбросить копию всех переменных среды, извлечь текущий путь к каталогу обратно из стека и получить также состояния расширений команд и отложенного расширения из стека и соответственно установить эти две функции, что означает здесьотключение отложенного расширения.Прочитайте этот ответ для получения подробной информации о командах SETLOCAL и ENDLOCAL .
Для понимания используемых команд и их работы откройте командную строкувыполните следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
echo /?
endlocal /?
for /?
set /?
setlocal /?