dos-batch文件
输入文件有三条记录:
HOW NOW BROWN COW
JACK AND JILL
100% JUST YOU & ME
脚本如下:
@echo off
set infile=e:\file.txt
set outfile=e:\outfile.txt
for /F "tokens=*" %%H in (%infile%) do (
call :Loop "%%H"
)
exit /b 0
:Loop
for %%a in (%*) do echo %%~a >> %outfile%
exit /b 0
输出:
E:\>foo2
E:\>type outfile.txt
HOW NOW BROWN COW
JACK AND JILL
100 JUST YOU & ME
角色%消失了! 你知道为什么吗?
答案 0 :(得分:2)
这是一个特殊的角色,如果你做100 %%它将正确输出为100%。我想有一些方法可以优雅地处理它,但你可能不得不玩一些。
编辑:在http://www.dostips.com/DtCodeBatchFiles.php上进行了一些挖掘并遇到了BatchSubstitute.bat
改编它并且我认为它应该对你有用 - 如果有人完全理解发生了什么,我想听听它 - 我只有一个vauge概念:
@echo off
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION
set infile=e:\file.txt
set outfile=e:\outfile.txt
for /f "tokens=1,* delims=]" %%A in ('"type %infile%|find /n /v """') do (
set "line=%%B"
if defined line (
call set "line=echo.%%line%%"
for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X >> %outfile%
) ELSE echo. >> %outfile%
)
答案 1 :(得分:0)
在您的情况下问题是call :loop "%%H"
,您无法使用call
按值传输内容,因为它可以更改内容,此处删除%。
另一种方法是通过引用调用变量call :func myVar
但由于call
非常慢,最好的方法是在循环中完成这些工作。
for循环的另一个问题是感叹号!
和插入符号^
通常他们会被摧毁,但你可以通过延迟切换技术来避免这种情况。
set infile=e:\file.txt
set outfile=e:\outfile.txt
setlocal DisableDelayedExpansion
for /f "delims=" %%A in ('"findstr /n ^^ %infile%"') do (
set "line=%%A"
setlocal EnableDelayedExpansion
set "line=!line:*:=!"
(echo(!line!)>>%outfile%
rem CALL :func line
endlocal
)