3

dosバッチファイル

入力ファイルには 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

出力:

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

もう 1 つの方法は、変数を使用して参照によって呼び出すことです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
)
于 2011-06-13T17:55:43.550 に答える