2017-05-11 10 views
0

以下のタスクに使用できるバッチファイルを作成しようとしています - 特定のテキストファイルを検索し、その中にテキスト行を追加する指定された行テキストファイルを検索してバッチファイルで行を追加する

dir /s /a /b "%SystemDrive%\config*.ini" >> %userprofile%\temp.txt 

for /F "tokens=* delims=," %%G IN (%userprofile%\temp.txt) DO (echo "%%G" >> %userprofile%\temp2.txt) 

for /F "tokens=* delims=," %%G IN (%userprofile%\temp2.txt) DO (

    SETLOCAL ENABLEDELAYEDEXPANSION  

    cd %%~dG%%~pG 

    set inputFile=%%~nG%%~xG 
    set outputFile=in.tmp 
    set _strInsert=TCPPortNumber=870 
    set _strFind=Random=No 


     FOR /F "usebackq delims=" %%A IN ("%inputFile%") DO (
     Echo %%A | Find "%_strFind%" && ECHO %%A>>"%outputFile%" && ECHO %_strInsert%>>"%outputFile%" 
     IF [!errorlevel!] == [1] ECHO %%A>>"%outputFile%" 

    ) 
    MOVE /Y "%outputFile%" "%inputFile%" && DEL /F /Q "%outputFile%" 

config*.iniファイル(複数可)を検索するとtemp.txtに結果を書き込み:私は、次のアプローチを使用しようとしています。 temp.txt - >temp2.txtに各行のファイルパスにスペースがある場合の引用符の挿入。次に、の各ファイルパスに対して、TCPPortNumber=870という行をRandom=Noの下に挿入しようとしています。私は "ハード"ファイルパスを使用する場合、このアプローチは動作しますが、ファイルパスをtemp2.txtから読み取ると、エラー:The system cannot find the file specifiedが返されます。 誰も助けることができますか? (それはendlocalにマッチされていない限り)、それはスイッチではなく、従ってループ内、フレームを確立するため

+0

なぜあなたが正常に移動した後にソースファイルを削除しますそれは(コードの最後の行で)?移動はソースファイルがもはやとはならないことを意味します... – aschipfl

答えて

0
SETLOCAL ENABLEDELAYEDEXPANSION  
dir /s /a /b "%SystemDrive%\config*.ini" >> %userprofile%\temp.txt 

set outputFile=in.tmp 
set _strInsert=TCPPortNumber=870 
set _strFind=Random=No 
for /F "usebackqdelims=" %%G IN ("%userprofile%\temp.txt") DO (
pushd %%~dpG 
FOR /F "usebackq delims=" %%A IN ("%%~nxG") DO (
    ECHO %%A>>"%outputFile%" 
    Echo %%A | Find "%_strFind%" && >>"%outputFile%" ECHO %_strInsert% 
) 
MOVE /Y "%outputFile%" "%%~nxG" 
popd 
) 
endlocal 

setlocalコマンドがcmdは、多くのネストされたローカル環境を確立して、ループ内であってはなりません。

3つの定数文字列は、値が変更されないためループ外にも表示されます。

2番目の一時ファイルは、各行が引用された最初のものであるため、必須ではありません。

%temp%ので、スペースを含んでいてもよい、for/f ... %% G needs to have the filename quoted, and consequently the usebackq option. The line is to be accepted into %% G in its entirity, so delims = '区切り記号をオフに、必要とされます。

サブストリングセレクタを組み合わせることができます。したがって、~dpはドライブとパスを、~nxは名前と拡張子をそれぞれ割り当てます。元のコードで

inputfileが設定されていたが、%inputfile%全体ブロック(行の括弧の配列)は値の変化として実行時にない解析された時点でinputfileの値に解決されますコードの実行を通じて。これは一般的に発生するdelayed expansionの問題です。何百もの参照がここにあります。

特定の行の後ろに行を挿入するだけなので、各行を再現して挿入が必要かどうかを確認するだけで、コードを簡略化できます。 echoの前にリダイレクタを配置すると、リダイレクタの前にデバイス番号を付けてリダイレクトするデバイスを選択するWindows-NTの特性が克服されます。

出力ファイルは、もはや私は実際にこのコードを試していない

存在しますので、最後に、move /yは、出力ファイルと入力ファイルの交換を強制しない - あなたは小さなコピーサブツリーに対してそれを実行する必要があります実際のデータを評価し、それに頼る前に評価してください。


小さな修正は - pushdにオリジナルcdを変更しpopd対応する追加も除去余分%

PUSHDは指定された現在のディレクトリを変更します。POPDは元のカレントディレクトリを復元します。

余分%は、キーイングエラー(私の通常のマシンが病気であると私はラップトップを使用する必要があります - 私はキーボードを嫌うん、と男の子を...)だった

+0

詳細な説明をありがとう!あなたの深い知識を感謝します。検索されたファイルが存在するドライブからスクリプトが起動されていれば、スクリプトは機能しています。私の場合、%SystemDrive%のどこからでもスクリプトを起動するとうまくいきます。しかし、%SystemDrive%とは異なるディレクトリからスクリプトを起動すると、システムはファイルを見つけることができません。指定されたファイルが見つかりません。とにかくあなたのスクリプトは私のニーズに合っているので、私のために働いています。最後のパーセント記号の意味は何ですか?MOVE/Y "%outputFile%" "%%〜nxG%" - スクリプトは、 –

+0

これは完全な解決策です:)。 10倍 –

関連する問題