我有此文本文档(txt1.txt):
&()[]{}^=;!'+,`~.mp3
¿¡áéíóú!.mp3
使用FOR命令处理它时,我丢失了诸如“ ^”和“!”之类的字符。
bat文件如下(它有两个FOR命令,也许可以简化为一个,而第二个文件的末尾有一个ECHO命令,我不知道它是否可以更好地实现): / p>
@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
答案 0 :(得分:0)
将此代码用于批处理文件:
@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 循环的说明,请参见我对How to read and print contents of text file line by line?的回答, FOR 会忽略源文件中的空行,在这里应该没有问题看起来源文件包含一个MP3文件名列表。
该问题不包含源文件的示例内容和输出文件的预期内容的示例。因此,使用我自己创建的源文件对代码进行了测试,这些文件是在How to read and print contents of text file line by line?上发布的行,其中添加了几行并附加了.mp3
,而添加了一行并添加了^
。
如果所有行都以.mp3
结尾,则最好使用:
echo set TRACK!LineNumber!=!Line:~0,-4!
在这种情况下,从文件读取的行不输出最后四个字符。
将从文件读取的行分配给环境变量Line
时,必须启用延迟扩展 NOT ,这一点很重要。否则,cmd.exe
将第二次解析此行,如How does the Windows Command Interpreter (CMD.EXE) parse scripts?所述。在SET LINE=%%I
的第二次解析中,从文件读取的行中的每个^
被解释为转义符,每个{ {1}}被解释为环境变量引用的开始/结束。
因此,在禁用延迟扩展的同时,必须首先将从文件读取的行分配给环境变量!
,以避免在Windows命令处理器执行命令 SET 之前解析该行。 。然后启用延迟的环境变量扩展,这将导致创建当前环境变量列表的副本,将当前目录路径压入堆栈,并将命令扩展的当前状态和延迟的环境变量扩展压入堆栈,然后再启用延迟扩展。然后,可以以行号开头并且不区分大小写地从行中删除所有Line
出现的行,并输出带有附加文本的行。最后,必须使用命令 ENDLOCAL 丢弃所有环境变量的副本,从堆栈中弹出当前目录路径,并从堆栈中弹出命令扩展的状态和延迟扩展的状态,并据此设置这两个功能在此禁用延迟的扩展。阅读this answer,了解有关命令 SETLOCAL 和 ENDLOCAL 的详细信息。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
.mp3
echo /?
endlocal /?
for /?
set /?