2017-10-24 11 views
0

バッチファイルを使用しているファイルから変数を設定しようとしています(ファイルハッシュは変数名です)。私はenableDelayedExpansionを使用しているとして、それは特殊文字が含まれている場合ファイルから変数へのforループの特殊文字の解析

  1. 、特に感嘆符(秒):ああ、私はこの2つの問題に直面して貼り付けました。

  2. &を&に変更する必要があります。

私はさまざまなソースから提供されたいくつかのソリューションを試しましたが、私の要求に合致しませんでした。

@echo off 
set grep=binaries\grep.exe 
set fileindex=binaries\index.htm 
set count=0 
for /f "tokens=* delims=" %%a in (crc.dat) do ( 
set count=!count! + 1 
set filehash=%%a 
%grep% --ignore-case -w "!filehash!" %fileindex%>> list.dat 
) 

そしてcrc.datファイル内に何の例:list.datに上記の私の現在のコードを使用して

Kabooom! Kablooey! 
Kaboom & Kablooey 

そして結果:

は、ここに私の現在のコードです

Kabooom Kablooey 
Kaboom & Kablooey 

私がlist.datで期待している結果:

Kabooom! Kablooey! 
Kaboom & Kablooey 

私は問題を正しく伝えてくれてありがとうと思います!

+0

grepとfileindexに使用しているset文でコードを更新してください。 – Squashman

+0

投稿を編集してgrepとfileindexの両方のset文を追加しました – Angga

+0

FOR変数を環境変数に割り当てるのはなぜですか? GREPでFOR変数を使用すると、遅延拡張を有効にする必要はありません。 – Squashman

答えて

1

、これを使用する:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "grep=binaries\grep.exe" 
set "fileindex=binaries\index.htm" 
set "file=crc.dat" 
set "list=list.dat" 

rem // Initialise counter: 
set /A "count=0" 
> "%list%" (
    for /F "usebackq delims=" %%a in ("%file%") do (
     rem // Increment counter: 
     set /A "count+=1" 
     rem // Assign line string to variable: 
     set "lineitem=%%a" 
     rem // Toggle delayed expansion: 
     setlocal EnableDelayedExpansion 
     rem // Do sub-string replacement: 
     set "lineitem=!lineitem:&=&!" 
     rem // Execute `grep` command line: 
     "!grep!" --ignore-case -w "!lineitem!" "!fileindex!" 
     endlocal 
    ) 
) 
rem // Return counter: 
echo/%count% 

endlocal 

grep出力に&&を交換するには、これを使用する:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "grep=binaries\grep.exe" 
set "fileindex=binaries\index.htm" 
set "file=crc.dat" 
set "list=list.dat" 

rem // Initialise counter: 
set /A "count=0" 
> "%list%" (
    for /F "usebackq delims=" %%a in ("%file%") do (
     rem // Increment counter: 
     set /A "count+=1" 
     rem // Execute `grep` command line and capture its output by `for /F`: 
     for /F "delims=" %%b in ('^""%grep%" --ignore-case -w "%%a" "%fileindex%"^"') do (
      rem // Assign `grep` output to variable: 
      set "lineitem=%%b" 
      rem // Toggle delayed expansion: 
      setlocal EnableDelayedExpansion 
      rem // Do sub-string replacement: 
      set "lineitem=!lineitem:&=&!" 
      rem // Return modified string: 
      echo(!lineitem! 
      endlocal 
     ) 
    ) 
) 
rem // Return counter: 
echo/%count% 

endlocal 

通常、感嘆符を含む文字列を処理するには、通常の%拡張された変数とforという可変参照が%%aのように拡張され、遅延拡張が無効になるように遅延拡張を切り替える必要があります。

+0

最初のものはとてもうまく動作します!、ありがとう! – Angga

0

これはフリーであり、&&に置き換えることができる解決策です。

@echo off 
set grep=binaries\grep.exe 
set fileindex=binaries\index.htm 
set count=0 

for /f "tokens=* delims=" %%a in (crc.dat) do ( 
    set /a count+=1 
    %grep% --ignore-case -w "%%a" %fileindex%>>temp.dat 
) 
powershell -Command "(gc temp.dat) -replace '&', '&' | sc list.dat" 
del /f temp.dat 
pause 
exit /b 

いくつか変更されたもの:

  • set /a count+=1 = set /a count=%count%+1
      %%aから
    • !fileHash!ポイントを、私たちはそれを、なぜ必要なのですか? %%aが動作します。
  • powershellコマンドは、&&に置き換えます。
  • 置き換えられた内容をファイルに出力します。
  • 使用する一時ファイルを削除します。grep入力に&&を置き換えるために
+0

答えてくれてありがとう、スティーブ! あなたが書いたものに基づいて感嘆符の問題を解決することができましたが、アンパサンドは依然として「 」です。 私はあなたがラベルと一緒にすることを提案していますが、結果は残念ながらオフです。 – Angga

+0

私はスクリプトをもう一度編集し、意図したとおりに機能するはずです。 – SteveFest

+0

私は更新されたものを試しましたが、今すぐ置換サブルーチンをバイパスしたようです。私は単純なエコーを追加し、それが表示されません。 [例](https://imgur.com/a/MgJZ5)です。 最初は閉じた ')'を忘れてしまったと思っていましたが、それは好きではないようです。 – Angga

関連する問題