Как не потерять спецсимволы при обработке текстового файла в виде летучей мыши? - PullRequest
0 голосов
/ 24 мая 2019

У меня есть этот текстовый документ (txt1.txt):

&()[]{}^=;!'+,`~.mp3
¿¡áéíóú!.mp3

При обработке команды FOR я теряю символы, такие как «^» и «!».

Файл bat выглядит следующим образом (в нем есть две команды FOR, которые, возможно, можно упростить до одной, а у второй в конце есть команда ECHO, которую я не знаю, может ли она быть реализована лучше):

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
CHCP 1252
SET TXTFILE1=txt1.txt
SET TXTFILE2=txt2.txt
(
    FOR /F "usebackq delims=" %%I IN (%TXTFILE1%) DO (
        SET LINE=%%I
        ECHO !LINE:.mp3=!
    )
) > %TXTFILE2%
SET LINENUMBER=1
SET TXTFILE3=txt3.bat.txt
FOR /F "usebackq eol=| delims=" %%J IN (%TXTFILE2%) DO (
    ECHO SET TRACK!LINENUMBER!=%%J>> %TXTFILE3%
    SET /A LINENUMBER+=1
)
ECHO EXIT /B>> %TXTFILE3%
ENDLOCAL
PAUSE > NUL | SET /P =Presione una tecla para salir . . . & ECHO(
EXIT

1 Ответ

0 голосов
/ 24 мая 2019

Используйте этот код для пакетного файла:

@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 /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...