2017-08-27 92 views
1

我得到了此代码(在此question),它查找并替换字符串,但它在输出文件的末尾添加一个空白的新行,并使其不可用。批量查找和替换字符串添加空白行

@echo off &setlocal 
set "Russian=g_language = Russian" 
set "English=g_language = English" 

set "textfile=user.cfg" 
set "newfile=user.bak" 

Call :SwapLang Russian 

:search 
Color 9B 
@echo off&prompt :&mode con cols=60 lines=16 


echo. 
echo. 
echo. 
echo. 
echo. 
echo. 
echo. 
echo      PLEASE RUN NOTEPAD 
echo. 
echo. 
echo. 
echo. 
echo. 

:search 
TIMEOUT /T 2 
TASKLIST|FIND "notepad.exe" 
IF %ERRORLEVEL% equ 0 (GOTO found) ELSE (GOTO search) 

:found 

Call :SwapLang English 

Goto :Eof 

:SwapLang %1 byRef 
(for /f "delims=" %%i in (%textfile%) do (
    set "line=%%i" 
    setlocal EnableDelayedExpansion 
    If /I "!line:~0,12!" Equ "g_language =" (
    echo(!%1! 
) Else (
    echo(!line! 
) 
    endlocal 
)) > "%newfile%" 
del %textfile% 
rename %newfile% %textfile% 
Goto :Eof 

输入文件:它有没有空行6行。

sys_usefrontline = 1 
net_frontline_address = s1.gmru.net 
net_frontline_port = 5050 
g_language = Russian 
cl_promoPageWidth = 820 
cl_promoPageHeight = 726 

OUTPUT1 FILE:它有7行,最后行是空的(在这里不能示出)。

sys_usefrontline = 1 
net_frontline_address = s1.gmru.net 
net_frontline_port = 5050 
g_language = Russian 
cl_promoPageWidth = 820 
cl_promoPageHeight = 726 

OUTPUT2 FILE:它有7行,最后行是空的(在这里不能示出)。

sys_usefrontline = 1 
net_frontline_address = s1.gmru.net 
net_frontline_port = 5050 
g_language = English 
cl_promoPageWidth = 820 
cl_promoPageHeight = 726 

有人可以帮助我吗?

+0

代码中没有任何东西可以产生额外的行。你的意思是“我输入文件中的最后一行没有终止符('CRLF')”? 'CRLF'确实使文件无法使用? – Stephan

+0

我不知道真的。 –

+0

@Stephan Echo总是以cr/lf结束一行。该文件的最后一行没有,也不应该有cr/lf。我去了PowerShell,但它的Set-Content也一样。只有我发现的方式是dot net的'[IO.File] :: WriteAllText()' – LotPings

回答

0

批量编辑文件不理想。该批次使用PowerShell中做编辑,正则表达式:

:: Q:\Test\2017\08\25\SO_45879928.cmd 
@echo off &setlocal 

set "textfile=user.cfg" 

Call :SwapLang Russian 

:search 
Color 9B 
@echo off&prompt :&mode con cols=60 lines=16 
echo. 
echo. 
echo      PLEASE RUN NOTEPAD 
echo. 
echo. 
:search 
TIMEOUT /T 2 
TASKLIST|FIND "notepad.exe" 
IF %ERRORLEVEL% equ 0 (GOTO found) ELSE (GOTO search) 

:found 

Call :SwapLang English 

Goto :Eof 

:SwapLang %1 
Powershell -NoP -C "$txt=(gc %textfile% -raw) -replace '(?<=g_language =)(English|Russian)','%1';[IO.File]::WriteAllText('%textfile%', $txt)" 

Goto :Eof 
+0

结果与上面的批处理相同。我想我会放弃这种方法,并尝试复制>重命名文件的方法。 –

+0

看起来像'sc'或'Set-Content'还会在文件[refernce](https:// stackoverflow)的末尾放置一个终止cd/lf。com/questions/30751320/powershell-replace-content-in-file-adds-redundent-carriage-return)解决方法来自我的答案中的参考答案。现在应该工作。 – LotPings

+0

@ LotPings我不得不感谢您花时间和精力回答您的问题! –

0

我替你解决原来的问题:使用msr.exe如下仅有2命令行Batch check and replace string then wait for a process:(已满的消息是存在的,与一多彩的屏幕截图

msr -p user.cfg -it "(g_language\s*=\s*)\w*" -o "${1}Russian" -R

msr -p user.cfg -it "(g_language\s*=\s*)\w*" -o "${1}English" -R

Additonaly,你的问题在这里,也是1个命令删除尾新线:

msr -p your-files-dirs -S -t "[\r\n]+$" -o "" -R

或者删除尾部的空格和换行:

msr -p your-files-dirs -S -t "\s+$" -o "" -R

根据stackoverflow规则,在这里再说一遍:msr.exe/msr.gcc*/msr.cygwin等是在我打开的项目https://github.com/qualiu/msrtools目录,作为的一般工具M atch/S earch/R替换文件/管道线路/块。