3

DOS批处理文件

输入文件有三个记录:

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

角色 % 不见了!你知道为什么吗?

4

2 回答 2

2

它是一个特殊字符,如果您将其设为 100%%,它将正确输出为 100%。我想有一些方法可以优雅地处理它,但你可能不得不玩一些。

编辑:做了一些挖掘并在http://www.dostips.com/DtCodeBatchFiles.php 上遇到了 BatchSubstitute.bat

对此进行了调整,我认为它应该对您有用-如果有人完全了解正在发生的事情,我想听听-我只有一个模糊的概念:

@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%
)
于 2011-01-31T18:36:40.977 回答
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
)
于 2011-06-13T17:55:43.550 回答