如何删除文件的最后一个字符
How to delete the last character of a file
我使用这个批处理文件来创建文件列表
@echo off
(for /f "delims=" %%a in ('dir/b/a-d *.tex') do echo %%a,)>liste.dat
结果是这样的
file1.tex,
file2.tex,
file3.tex,
...
lastfile.tex,
如何删除最后一个逗号?
问题是您不知道会有多少 lines/files。因此,您必须按照编写代码的方式使用两个循环。一个计算行数,一个执行操作。对第一行而不是最后一行进行不同的处理要容易得多。那么这个怎么样:
@echo off
SETLOCAL EnableDelayedExpansion
SET /a i=0
(for /f "delims=" %%a in ('dir /b/a-d *.tex') do (
IF !i!==1 (
echo ,%%a
) ELSE (
ECHO %%a
SET /a i=1
)
)
)>liste.txt
这将生成如下内容:
file1.tex
,file2.tex
,file3.tex
...
,lastfile.tex
这似乎等同于您想要的输出。如果你真的想要 ,
在行尾而不是在下一行的开头,请告诉我,我会更新代码,但它会很丑陋。
@echo off
SETLOCAL EnableDelayedExpansion
SET "in="
(
for %%a in (*.tex) do (
IF "!in!"=="" (
set in=%%a
) ELSE (
echo !in!,
set in=%%a
)
)
echo !in!
)>liste.dat
@echo off
setlocal EnableDelayedExpansion
set "comma="
< NUL (
for %%a in (*.tex) do (
set /P "=!comma!%%a"
set comma=,^
%Empty line%
)
echo/
) > liste.dat
编辑:回复评论
糟糕!当我开发这段代码时,我只是在屏幕上显示输出,它看起来是正确的:
C:\> test.bat
One.tex,
Three.tex,
Two.tex
即使输出被发送到文件并且文件显示在屏幕上,输出看起来也是正确的:
C:\> test.bat > output.txt
C:\> type output.txt
One.tex,
Three.tex,
Two.tex
但是,每个逗号后插入的字符只是一个 LF,因此如果使用记事本打开此文件,LF 将 不会 转换为 "end of lines";只是 cmd.exe screen 输出将 LF 转换为 CR+LF 对("cooked output" 而不是 "raw output").
解决这个细节的方法是在每个逗号后插入一个完整的 CR+LF 对:
@echo off
setlocal EnableDelayedExpansion
for /F %%a in ('copy /Z "%~F0" NUL') do set "CR=%%a"
set "comma="
< NUL (
for %%a in (*.tex) do (
set /P "=!comma!%%a"
set comma=,!CR!^
%Empty line%
)
echo/
) > liste.dat
我使用这个批处理文件来创建文件列表
@echo off
(for /f "delims=" %%a in ('dir/b/a-d *.tex') do echo %%a,)>liste.dat
结果是这样的
file1.tex,
file2.tex,
file3.tex,
...
lastfile.tex,
如何删除最后一个逗号?
问题是您不知道会有多少 lines/files。因此,您必须按照编写代码的方式使用两个循环。一个计算行数,一个执行操作。对第一行而不是最后一行进行不同的处理要容易得多。那么这个怎么样:
@echo off
SETLOCAL EnableDelayedExpansion
SET /a i=0
(for /f "delims=" %%a in ('dir /b/a-d *.tex') do (
IF !i!==1 (
echo ,%%a
) ELSE (
ECHO %%a
SET /a i=1
)
)
)>liste.txt
这将生成如下内容:
file1.tex
,file2.tex
,file3.tex
...
,lastfile.tex
这似乎等同于您想要的输出。如果你真的想要 ,
在行尾而不是在下一行的开头,请告诉我,我会更新代码,但它会很丑陋。
@echo off
SETLOCAL EnableDelayedExpansion
SET "in="
(
for %%a in (*.tex) do (
IF "!in!"=="" (
set in=%%a
) ELSE (
echo !in!,
set in=%%a
)
)
echo !in!
)>liste.dat
@echo off
setlocal EnableDelayedExpansion
set "comma="
< NUL (
for %%a in (*.tex) do (
set /P "=!comma!%%a"
set comma=,^
%Empty line%
)
echo/
) > liste.dat
编辑:回复评论
糟糕!当我开发这段代码时,我只是在屏幕上显示输出,它看起来是正确的:
C:\> test.bat
One.tex,
Three.tex,
Two.tex
即使输出被发送到文件并且文件显示在屏幕上,输出看起来也是正确的:
C:\> test.bat > output.txt
C:\> type output.txt
One.tex,
Three.tex,
Two.tex
但是,每个逗号后插入的字符只是一个 LF,因此如果使用记事本打开此文件,LF 将 不会 转换为 "end of lines";只是 cmd.exe screen 输出将 LF 转换为 CR+LF 对("cooked output" 而不是 "raw output").
解决这个细节的方法是在每个逗号后插入一个完整的 CR+LF 对:
@echo off
setlocal EnableDelayedExpansion
for /F %%a in ('copy /Z "%~F0" NUL') do set "CR=%%a"
set "comma="
< NUL (
for %%a in (*.tex) do (
set /P "=!comma!%%a"
set comma=,!CR!^
%Empty line%
)
echo/
) > liste.dat