我试图解决这个问题,但我想我已经离开了。这是我在互联网上发现的:
copy /A data.js data.js.new /B > nul
del data.js
ren data.js.new data.js
不知何故,它什么也没做。
如何创建一个bat文件来删除文件中的最后一个字符(如果重要的话,该字符是逗号)?
答案 0 :(得分:4)
@echo off
setlocal EnableDelayedExpansion
rem Count the number of lines, minus one
for /F %%a in ('find /C /V "" ^< data.js') do set /A lines=%%a-1
< data.js (
rem Copy number-1 lines
for /L %%i in (1,1,%lines%) do (
set "line="
set /P "line="
echo(!line!
)
rem Process last line
set /P "line="
echo(!line:~0,-1!
) > data.js.new
move /Y data.js.new data.js
答案 1 :(得分:2)
也许比它需要的更复杂,但我想避免在文件内容中延迟扩展破坏感叹号,同时保留空白行。批量不是这种事情的最佳语言。如果我是你,我只使用PowerShell或JScript和substring(0, data.length - 1)
或类似的。
无论如何,这是一个纯粹的批处理解决方案:
@echo off
setlocal
set "file=test.txt"
set "idx=0"
for /f "delims=" %%I in ('findstr /n "^" "%file%"') do (
set /a idx += 1
setlocal enabledelayedexpansion
for %%x in (!idx!) do endlocal & set "line[%%x]=%%I"
)
setlocal enabledelayedexpansion
for %%I in ("!line[%idx%]!") do endlocal & set "lastline=%%~I"
set "line[%idx%]=%lastline:~0,-1%"
setlocal enabledelayedexpansion
>"%file%" (
for /L %%I in (1,1,%idx%) do echo(!line[%%I]:*:=!
)
这是一个滥用PowerShell来完成相同任务的批量代码段。
>out.txt powershell "$c = (gc test.txt) -join \"`n\"; $c.substring(0, $c.length - 1)"
move /y out.txt test.txt >NUL
或者这是混合批量+ JScript解决方案。用.bat扩展名保存。
@if (@CodeSection == @Batch) @then
@echo off & setlocal
>out.txt (
cscript /nologo /e:Jscript "%~f0" < test.txt
)
move /y out.txt test.txt >NUL
goto :EOF
@end // end batch / begin JScript hybrid chimera
var data = WSH.StdIn.ReadAll();
WSH.StdOut.Write(data.substring(0, data.length - 1));
答案 2 :(得分:1)
以下批处理文件删除文件data.js
中的最后一个字符。这种方法的优点是,为了性能,只有一个循环。它背后的想法是遍历文件的行并输出每一行,但延迟一次迭代,所以最后一行可以在循环之后单独处理:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
> "data.js.new" (
for /F "delims=" %%L in ('
findstr /N /R "^" "data.js"
') do (
setlocal EnableDelayedExpansion
if defined PREV (
set "PREV=!PREV:*:=!"
echo(!PREV!
)
endlocal
set "PREV=%%L"
)
setlocal EnableDelayedExpansion
set "PREV=!PREV:*:=!"
if defined PREV (
echo(!PREV:~,-1!
)
endlocal
)
endlocal
> nul move /Y "data.js.new" "data.js"
for /F
循环不直接遍历这些行,而是通过findstr /N /R "^"
的输出,返回所有以行号和:
为前缀的行,甚至空行都有前缀,所以for /F
没有显示为空的行,否则会忽略这一行。要在循环中检索原始行,将删除第一个:
之前的所有内容。
延迟环境变量扩展(按setlocal
/ endlocal
;另请参阅set /?
),以便脚本不会丢失任何特殊字符和/或不会崩溃它们。