0

私は見つけて交換しようとしています。forループを使用しています。私は学んでいますが、もうすぐです。私は答えを見つけようとしましたが、情報源は私にとって少し混乱しすぎていました。

delimは空白であり、お分かりのように、4行をスキップして、2番目のトークンを実行しています。

その場所で見つかったものをvar5aに置き換える必要があります。var5aと等しくするために%%Fが必要なので、逆に持っています(今書いているように)。しかし、それを書く方法がわかりません。これを行う方法を説明してください。<< =を使ってみましたが、うまくいきませんでした。

for /f "skip=4 tokens=2 delims= " %%F in (script.vbs) do (
set var5a=!var5a!%%F
)

私は学んでいるので、親切にしてください。

4

2 に答える 2

0

%%Fがあり、 の値を現在の値Henriに設定したい場合Henrivar5a

set %%F=!var5a!

( !var5a!の RUN-TIME 値がvar5a必要な場合 (ENABLEDELAYEDEXPANSION モードが呼び出されている場合)、PARSE-TIME 値が必要な場合は%var5a% )


答えが機能することを示すプログラム:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

::: WARNING! This will overwrite SCRIPT.VBS

DEL script.vbs 2>nul
FOR /l %%i IN (1,1,4) DO >>script.vbs ECHO ignore this line %%i
>>script.vbs ECHO Oh Henri - it does work
>>script.vbs ECHO Now try again

ECHO ===== here is script.vbs

TYPE script.vbs

ECHO ===== script.vbs ends

SET var5a=this is the value

SET henri
SET var5a

ECHO ===== now run the FOR loop...

for /f "skip=4 tokens=2 delims= " %%F in (script.vbs) do (
 set %%F=!var5a!
)

SET henri

GOTO :eof

結果:

===== here is script.vbs
ignore this line 1
ignore this line 2
ignore this line 3
ignore this line 4
Oh Henri - it does work
Now try again
===== script.vbs ends
Environment variable henri not defined
var5a=this is the value
===== now run the FOR loop...
Henri=this is the value

さて - とはどういう意味"it doesn't work"ですか? 確かにそうです。あなたが望んでいることをしていない場合は、なぜその主張をするのかを示してください。

たとえば、ソース ファイルの 4 行の後にスペースで区切られた番号 2 の唯一のトークンではないtryため、上記も値に設定されます。Henriこれは簡単に修正できます (ただし、私はマインドリーダーではありません。ただの謙虚なプログラマーです)。

(set notsetyet=Y)
for /f "skip=4 tokens=2 delims= " %%F in (script.vbs) do (
 IF DEFINED NOTSETYET set %%F=!var5a!&(set notsetyet=)
)

しかし、間違っ"it didn't work"Henri値に設定されている可能性があります。または、おそらくクラッシュしました。あなたの回答からはわかりません。

于 2013-03-21T05:49:39.347 に答える
0
@ECHO OFF
SETLOCAL
:: Replace token 2 (space-separated) in line 5 of a file with REPLACEMENT
:: Assumed the file exists, etc. and no line begins ":"
SET replacement=THIS IS THE REPLACEMENT TEXT
DEL newfile.txt 2>nul
FOR /f "tokens=1*delims=:" %%i IN ('findstr /n /r "$" ^<oldfile.txt') DO (
IF %%i==5 (
FOR /f "tokens=1,2* delims= " %%L IN ("%%j") DO >>newfile.txt ECHO %%L %replacement% %%N
) ELSE (>>newfile.txt ECHO.%%j)
)

TYPE oldfile.txt
ECHO ==== separator =======
FC oldfile.txt newfile.txt

結果:

Line one should not be changed
Line two should not be changed
Line three should not be changed
Line four should not be changed
changeme iwillbereplaced but only on this line
and notbereplaced on subsequent lines

including the previous line which was empty
==== separator =======
Comparing files oldfile.txt and NEWFILE.TXT
***** oldfile.txt
Line four should not be changed
changeme iwillbereplaced but only on this line
and notbereplaced on subsequent lines
***** NEWFILE.TXT
Line four should not be changed
changeme THIS IS THE REPLACEMENT TEXT but only on this line
and notbereplaced on subsequent lines
*****

問題があります-特に、ファイル内の行がコロンで始まる場合、または引用符で囲まれた文字列または通常のバッチの落とし穴のいずれかが含まれている場合%


だから - やっと私はあなたが何をしているのかを理解しました。%%F文字列が引用符で囲まれているだけでなく、スペースも含まれているという重要な情報を省略しました。

そもそもあなたがそう言っていたら、あなたはプロジェクトにさらに数時間かかり、私は一握りのアスピリンでより豊かになるでしょう.

引用符で囲まれた文字列で %%F をロードするために、ファイルから文字列を読み取りました。

@ECHO OFF
SETLOCAL enabledelayedexpansion
:: Replace token 2 (space-separated) in line 5 of a file with REPLACEMENT
:: Assumed the file exists, etc. and no line begins ":"
SET replacement="THIS IS THE REPLACEMENT TEXT"
DEL newfile.txt 2>NUL

:: iwbr.txt just contains
:: "i will be replaced"
:: on a single line for loading into %%F as that is the target to be replaced


FOR /f "delims=" %%F IN (iwbr.txt) DO (
FOR /f "tokens=1*delims=:" %%i IN (
  'findstr /n /r "$" ^<oldfile.txt'
 ) DO >>newfile.txt (
  IF %%i==5 (
   SET newline=%%j
   CALL SET newline=%%newline:%%F=%replacement%%%
    ECHO.!newline!
  ) ELSE (ECHO.%%j)
  )
)
TYPE oldfile.txt
ECHO ==== separator =======
FC oldfile.txt newfile.txt

結果:

Line one should not be changed
Line two should not be changed
Line three "should" not be changed
Line four should not be changed
changeme "i will bereplaced" but only on this line
and notbereplaced on subsequent lines

including the "previous" line which was empty
including this "unbalanced-quote line...
==== separator =======
Comparing files oldfile.txt and NEWFILE.TXT
***** oldfile.txt
Line four should not be changed
changeme "i will bereplaced" but only on this line
and notbereplaced on subsequent lines
***** NEWFILE.TXT
Line four should not be changed
changeme "THIS IS THE REPLACEMENT TEXT" but only on this line
and notbereplaced on subsequent lines
*****
于 2013-03-21T08:01:16.103 に答える