2011-01-31 206 views
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 

OUTPUT:

E:\>foo2 

E:\>type outfile.txt 
HOW NOW BROWN COW 

JACK AND JILL 

100 JUST YOU & ME 

字符%是走了! 你有什么想法为什么?

回答

2

这是一个特殊的字符,如果你设置为100%,它将以100%正确输出。我想可以有一些方法来优雅地处理,但你可能需要玩一些。

编辑:做了一些挖掘和跨BatchSubstitute.bat来到http://www.dostips.com/DtCodeBatchFiles.php

它适应于这一点,我认为它应该为你工作 - 如果有人完全了解发生了什么,我想OT听到它 - 我只有一个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% 
) 
0

在你的情况下,问题是call :loop "%%H",你不能使用call按值传递的内容,因为它可以改变的内容,这里%被删除。

另一种方法是通过引用与变量call :func myVar进行通话。
但是因为call真的很慢,所以最好的方法是在循环中正确地做这些事情。

for-loops的另一个问题是感叹号!和插入符号^
通常它们会被破坏,但是您可以通过延迟切换技术来避免这种情况。

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 
) 
相关问题