0

わかりました。スクリプトを作成しています。複数のテキストファイルから値を取得するスクリプトを作成していますが、ファイルを1つのテキストファイルに結合するための適切な方法が見つからないようです。

FOR /f "tokens=%toknum% delims=:" %%G in ('"find /v /c "" "%~dp0\!systype!Win7Updates.txt""') do set maxcnt=%%G

テキストファイル内:

KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart

私は、ファイルに領域を作成して、それがものを分離する方法を理解しようとしています。タイトルを探して、タイトルに移動すると、その下にあるものがすべて読み込まれます。

私がやろうとしていることの例。(CSVファイルでもこれを実行しようとしています)したがって、スクリプトでWindows Vistaのパッチ領域を見つけて、その領域の下にあるものだけをロードするようにします。それが可能かどうか誰か知っていますか?

:Windows 7 Patches
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart

:Windows Vista Patches
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
4

1 に答える 1

1

「その下のすべてがロードされます」というあなたの声明は明確ではありません。次のタイトルまで、タイトルの下のすべてを意味していると思います。「ロードされた」とはどういう意味か本当にわかりません。おそらく、それらの行を別のファイルに追加しますか?このソリューションでは、単純に線をエコーし​​ます。

テストケースはかなり不完全です。セクションの内容は同じであるため、コードが正しく機能しているかどうかを判断するのは困難です。これは、解釈しやすいはずの、より興味深いテストケースです。!FORループを使用する場合の拡張の遅延の問題を説明するために、いくつかの文字を追加しました。

test.txt

:Windows 7 patches
Windows 7 line 1!
Windows 7 line 2!
Windows 7 line 3!

:Windows Vista patches
Windows Vista line 1!
Windows Vista line 2!
Windows Vista line 3!

:Windows XP patches
Windows XP line 1!
Windows XP line 2!
Windows XP line 3!

これは、Vistaパッチセクションのみをエコーするバッチスクリプトです。ループ内で遅延拡張のオンとオフを切り替えて、を保護し!ます。遅延拡張がオンになっている場合、%%Aの拡張は正しく機能しません。

@echo off
setlocal disableDelayedExpansion
for /f "delims=:" %%N in ('findstr /n /c:":Windows Vista patches" test.txt') do set skip=%%N
for /f "skip=%skip% delims=" %%A in (test.txt) do (
  set ln=%%A
  setlocal enableDelayedExpansion
  if "!ln:~0,1!"==":" (endlocal & goto :break)
  endlocal
  echo %%A
)
:break

上記の解決策は、空白行を取り除きます。必要に応じて空白行を保持するためのトリックがあります。;また、デフォルトのFOR / F "EOL"オプションのために、で始まる行もすべて削除されます。繰り返しますが、必要に応じてこれを回避するために利用できるトリックがあります。

于 2012-06-20T12:15:06.923 に答える