6

このイディオムを(何度も)使用してレジストリ値を環境変数に読み込むバッチファイルがあります。

FOR /F "tokens=2* delims=  " %%A IN ('REG QUERY "HKLM\SOFTWARE\Path\To\Key" /v ValueName') DO SET MyVariable=%%B

(後にタブ文字がありますdelims=

これは、何千もの顧客のコンピューターで正常に機能します。しかし、ある顧客のコンピューター(Windows Server 2003を実行し、コマンド拡張機能が有効になっている)では、内部または外部コマンド、操作可能なプログラム、またはバッチファイルとして認識されず
に失敗します。" "コマンドを単独で'REG QUERY "HKLM\SOFTWARE\Path\To\Key" /v ValueName'実行すると正常に機能します。に存在します。 reg queryReg.exeC:\Windows\System32

コードをに変更することで問題を回避することができました

REG QUERY "HKLM\SOFTWARE\Path\To\Key" /v ValueName > temp.txt
FOR /F "tokens=2* delims=  " %%A IN (temp.txt) DO SET MyVariable=%%B

これでお客様は稼働しましたが、なぜ問題が発生したのかを理解し、将来的に回避できるようにしたいと思います。

主なトピックから少し外れています-レジストリ値(文字列またはDWORD)を環境変数に取得するためのより直接的な方法も役立ちます。

4

4 に答える 4

1

うわー、それは奇妙です。

同じコマンドが2行に分割されたときに機能する場合は、FORコマンドのサブシェルでコマンドが実行される方法と関係があると思います。

この特定のケースでなぜ死にかけているのかを本当に知りたがっている場合は、FORコマンドとして「SET> envvars.txt」などのコマンドを実行し、それをトップシェルと比較することができます。

または、単純なものから始めて、CMD / Cを介してREGコマンドを実行してみて、それが何かを行うかどうかを確認しますか?

ここで簡単に推測すると、COMSPECとSHELLの値は何ですか?

于 2008-10-09T04:08:47.870 に答える
1

私はチェックします:

  1. マシンでの顧客の役割 - 彼らは管理者ですか?
  2. ボックスの reg.exe はどこにありますか? パスに複数の reg.exe のコピーがありますか?
  3. これが正常に機能するマシンと、顧客のマシンにロケールの違いはありますか?

基本的に、このマシンと期待どおりに動作するマシンとの相違点をすべて列挙します。サービス パック、ドメイン メンバーシップなどを含めます。

于 2008-10-08T16:04:08.240 に答える
1

これに似た状況がありました。私の場合、それは COMSPEC の悪い値でした。私はそれを修正し、スクリプトは期待どおりに機能し始めました。

于 2011-12-16T00:10:34.803 に答える
0

スイッチでは、/Fコマンド拡張機能をオンにする必要があります。通常はデフォルトでオンになっていますが、私はそれを確認します。XPシステムでは、次のようにして有効にすることができます

cmd /e:on

または以下のレジストリを確認します

HKCU\Software\Microsoft\Command Processor\EnableExtensions

Windows Server についてはわかりません。

やっhelp forhelp cmdいて、いくつかのヒントも提供できます。

于 2008-10-08T15:47:25.667 に答える