2011-01-31 6 views
3

ドス・バッチファイルパーセンテージ(%)をルーチンに渡す方法はありますか?

は、入力ファイルは3つのレコードがあります。

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%として正しく出力されます。私はそれを優雅に扱う方法があると思いますが、あなたはいくつかのことをしなければならないかもしれません。

EDIT:は、いくつかの掘削を行なったし、http://www.dostips.com/DtCodeBatchFiles.php

にBatchSubstitute.batに出くわしたこのにそれを適応し、私はそれがあなたのために働くべきだと思う - 誰もが完全に何が起こっているか理解している場合、私はそれを聞いotの希望それはここ%が削除され、内容を変更することができるよう、あなたは、値でコンテンツを転送するためにcallを使用することはできません、あなたの場合は

@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"次のとおりです。 - 私はvauge概念を持っています。

別の方法は、変数call :func myVarで参照することです。
しかし、callは本当に遅いです、最良の方法は、ループ内のものを正しく行うことです。

forループのもう1つの問題は、感嘆符!とキャレット^です。
通常、それらは破壊されますが、遅延トグル技術でこれを回避できます。

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 
) 
関連する問題