2

ループ内のファイルのすべての行を読み取り、文字列を別の文字列に置き換えるバッチファイルを作成したいと思います。以下は私のコードスニペットです:

for /F "tokens=*" %%i in (myfile) do (
  set str=%%i
  set str=%str: %oldstring% = %newstring%%
echo %str% >> newfile
)

これにより、myfileにあるのと同じ数の行が「Echoisoff」の新しいファイルになります。%% iに割り当てられた場合、str変数はまったく値を保持しないようです。誰かが私を助けることができますか?

4

3 に答える 3

4

この小さなスクリプトを試してみてください。

@echo off
set val=50
echo %val%
for /l %%i in (1,1,1) do (
    set val=%%i
    echo %val%
)
echo %val%
pause>nul

出力は次のとおりです。

50
50
1

あなたが期待したものではありませんよね?

これは、forループでは、ループが終了するまで変数が更新されないためです。これに対抗するには、を使用しsetlocal enabledelayedexpansion、パーセント記号(%)を感嘆符()に置き換えることができます!

@echo off
setlocal enabledelayedexpansion
set val=50
echo %val%
for /l %%i in (1,1,1,) do (
    set val=%%i
    echo !val!
)
echo %val%
pause>nul

出力:

50
1
1

str変数が(ループ中に)値を保持しない理由は、for事前に設定されていないためです。

したがって、これらの簡単な変更で、スクリプトは機能します...

setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (myfile) do (
    set str=%%i
    set str=!str: %oldstring% = %newstring%!
    echo !str! >> newfile
)

ちなみに、このスニペットは、forloop内に設定されていないことを前提oldstringとしています。そうしないと、問題が発生します。newstring

楽しむ。

于 2013-03-08T10:31:00.617 に答える
1

これでしばらく時間を過ごしたので、私は正しい方法を手に入れました:

@echo off
setlocal enabledelayedexpansion

set oldstring=AF-07295
set /a count=1000

for %%f in (*.*) do (
  set /a count=!count!+1
  for /f "tokens=*" %%i in (%%f) do (
    set str=%%i

    call set str=%%str:!oldstring!=!count!%%
    echo !str! >> %%~nf.ordnew

  )
)

endlocal
于 2013-10-11T14:34:33.860 に答える
1
setlocal ENABLEDELAYEDEXPANSION
set filein="c:\program files\test1.txt"
set fileout="c:\program files\test2.txt"
set old=@VERSION@
set new=2.0.3
for /f "tokens=* delims=¶" %%i in ( '"type %filein%"') do (
    set str=%%i
    set str=!str:%old%=%new%!
    echo !str! >> %fileout% 
)

完璧に機能し、行ファイルの先頭の空白を削除していません

于 2014-03-28T14:08:16.000 に答える