Bat文件删除文件中的最后一个字符?

时间:2015-12-14 21:51:18

标签: batch-file

我试图解决这个问题,但我想我已经离开了。这是我在互联网上发现的:

copy /A data.js data.js.new /B > nul
del data.js
ren data.js.new data.js

不知何故,它什么也没做。

如何创建一个bat文件来删除文件中的最后一个字符(如果重要的话,该字符是逗号)?

3 个答案:

答案 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 /?),以便脚本不会丢失任何特殊字符和/或不会崩溃它们。