-1

かなり具体的な機能を実行するバッチファイルを作成しようとしています:

レジストリ キー「\HKLM\SYSTEM\CurrentControlSet\Control\Class{4D36E972-E325-11CE-BFC1-08002bE10318}」を検索します。

特定のテキスト文字列を含むすべてのサブキーを検索します。この場合は、「DriverDesc」値の「Intel」です。

"DriverDesc" 値に "Intel" を含むキーでのみ、"PnPCapabilities" 値データを "38" (16 進数) に変更します。

これらのことをそれぞれ個別に行う方法は知っていますが、それらすべてを 1 つのバッチで一緒に動作させることはできません。バッチ言語に関する私の知識はまだあまりにも限られており、自分で適切に行う方法や、既存のバッチを解読して変更する方法を知ることはできません。

混乱を避けるために、Intel NIC カードのペアの電源管理オプションを無効にしようとしています。他のNICが存在するか、またはそれらがインストールされた順序に関係なく、任意のマシンでこれを自動的に実行するバッチを作成したいと思います。

どんな助けでも大歓迎です。

以下は私が見つけ、試して失敗したものです:編集:新しいバッチ
EDIT2:
新しいバッチ、動作中

:start
setlocal ENABLEDELAYEDEXPANSION
set qry=reg query "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}" /s /v DriverDesc
for /f "Tokens=*" %%p in ('%qry%') do (
 set var=%%p
 set var=!var:^&=!
 set var=!var:^)=!
 set var=!var:^(=!
 call :parse
)
endlocal
goto :EOF
:parse
if /i "%var:~0,5%" NEQ "HKEY_" goto parse1
set key=%var%
set key=%key:HKEY_LOCAL_MACHINE=HKLM%
goto :EOF
:parse1
setlocal ENABLEEXTENSIONS
for /f "Tokens=*" %%f in ('@echo %var%^|findstr /i /c:"Intel(R)"') do (
  if defined key reg add %key% /v PnPCapabilities /t REG_DWORD /d 56 /f&set key=
)
endlocal >nul 2>&1

意図したとおりに動作するように修正されました。

4

2 に答える 2

0

以下は作業バッチです。私が正しい方向に進むのを手伝ってくれたJamesKに感謝します。

:start
setlocal ENABLEDELAYEDEXPANSION
    set qry=reg query "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}" /s /v DriverDesc
    for /f "Tokens=*" %%p in ('%qry%') do (
        set var=%%p
        set var=!var:^&=!
        set var=!var:^)=!
        set var=!var:^(=!
        call :parse
    )
endlocal
goto :EOF
:parse
if /i "%var:~0,5%" NEQ "HKEY_" goto parse1

set key=%var%
set key=%key:HKEY_LOCAL_MACHINE=HKLM%
goto :EOF

:parse1
setlocal ENABLEEXTENSIONS
    for /f "Tokens=*" %%f in ('@echo %var%^|findstr /i /c:"Intel(R)"') do (
        if defined key reg add %key% /v PnPCapabilities /t REG_DWORD /d 56 /f&set key=
    )
endlocal >nul 2>&1
于 2012-10-02T16:46:49.180 に答える
0

\1つには、HKEY の前にa を配置しないことと、もう 1 つの理由として を配置する\Class{4D36E972-E325-11CE-BFC1-08002bE10318}必要があります\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}。また、二重引用符は本当に必要ありません。

したがって、3 行目を作成します。

set qry=reg query HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318} /s

この行は問題があるようです:

call :parse2>nul 2>&1

に呼び出しparseてパイプstderrnul、次にリダイレクトする可能性がありますstdout。少なくとも と の間にスペースを入れて:parse2ください>nul 2>&1

次のように、 orステートメントの最後にparse2引き込んでparse1追加することで問題を排除することで、問題を解決できます。>nul 2>&1forif

:parse1
for /f "Tokens=*" %%f in ('@echo %line%^|findstr /i /c:"Intel(R)" ^|findstr /i /c:"DriverDesc"') do (
  if defined key reg add "\%key%" /v PnPCapabilities /t REG_DWORD /d 56 /f&set key=
) >nul 2>&1

それが私に飛び出すすべてです。しかし、それをレジストリに戻す前に、最初にファイルにパイプすることをお勧めします。そうすれば、すべてが適切にフォーマットされていることを確認できます。また、ファイルからいくつかの行を個別に切り取り、コマンド プロンプトに貼り付けて、reg期待どおりに反応するかどうかを確認することもできます。そうすれば、間違いを犯した場合に、産業規模でレジストリを台無しにするリスクがなくなります。

そうそう、レジストリの少なくとも変更する部分のバックアップを作成して、正確に以前の状態に復元できるようにします。念のためです。:D


編集:更新された質問への回答:

何らかの形で「出力」を確認するように設定されているifため、ステートメントは実行されません。%line%line:

変数 !line! を展開します。リテラル文字列 " " はどちらの検索文字列にも一致しない@echo line: |findstr /i /c:"vmxnet3" |findstr /i /c:"DriverDesc"ため、空行が発生します。line:

for空行を無視するため、ifステートメントが実行されることはありません。

Forの評価の結果、コマンドをDO実行するためのデータが得られる必要があります。

于 2012-09-21T08:35:24.857 に答える