有没有办法将百分比(%)传递给常规?

时间:2011-01-31 17:57:43

标签: batch-file for-loop dos subroutine

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

角色%消失了! 你知道为什么吗?

2 个答案:

答案 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
)