7

次の行を含むバッチファイルがあります(Windows XPでは、コマンド拡張機能が有効になっています):

for /f %%s in ('type version.txt') do set VERSION=%%s

一部のコンピューターでは正常に動作しますが (この SO questionで示されているように)、他のコンピューターでは cmd を強制終了します (コンソール ウィンドウが閉じます)。

なんで ?


注: コンピューターの構成は似ているようです: XpSP2、ユーザーには管理者権限があり、HKEY_CURRENT_USER\Software\Microsoft\Command Processor で「コマンド プロセッサ」が定義されていません...

4

5 に答える 5

5

私は最初の経験的な答えを得ました:

for /f %%s in (version.txt) do ...

すべてのコンピューターで問題なく動作します。

for /f「type filename」のようなdosコマンドではなく、ファイル名で機能するようです。

ただし、すべてのクライアントのコンピューターに当てはまるわけではありません (一部のコンピューターでは、「タイプ ファイル名」が正常に機能します)。

15 (簡単に ?) ポイントが必要な場合は ;-)、質問に対する回答を残すことができ
ます。そして、なぜDOSセッションを閉じるだけなのですか?


編集: 3 年後 (!)、barlopは同様の状況に直面し、「for /fcmd プロンプトをすぐに閉じますか?」という質問に詳しく説明されています。彼の結論は次のとおりです。

COMSPECSET+を実行するとリストされましたENTER
そのため、環境変数ウィンドウを開いたところ、COMSPECユーザー変数またはシステム変数の下にリストされていませんでした。システム変数に追加し、コマンド プロンプトを起動したところ、問題なく動作しているようです。

Andriy Mが barlop の質問への回答で言及した ss64 フォーラムのこのスレッドには、詳細が含まれています。

ウィンドウをリロードするには、 ' ' (または完了を要求したコマンド) を完了するための " for" ループ内のシェルアウトを設定する必要があります。dirComSpeccmd

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\ComSpec=
%SystemRoot%\system32\cmd.exe
于 2008-11-04T09:09:21.520 に答える
1

コマンド拡張機能に関しては、CMD.EXEが/ E:OFFで呼び出され、コマンド拡張機能が無効になっている可能性があります(レジストリで有効になっている場合でも)。

スクリプトでコマンド拡張シェルオプションを使用する場合は、スクリプトの最初に次のトリックを実行することを強くお勧めします。

--http: //www.ss64.com/nt/setlocal.htmlから貼り付けられた情報

引数を指定すると、SETLOCALはERRORLEVELを設定します。2つの有効な引数の1つが指定されている場合はゼロになり、そうでない場合は1つになります。

これをバッチファイルで使用して、次の手法を使用して、コマンド拡張機能が使用可能かどうかを判断できます。

VERIFY errors 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions

これは、「VERIFYエラー」がERRORLEVELを1に設定し、拡張機能が使用できない場合(たとえば、スクリプトがcommand.comで実行されている場合)、SETLOCALがERRORLEVEL値のリセットに失敗するために機能します。

コマンド拡張機能が永続的に無効になっている場合、SETLOCALENABLEEXTENSIONSはそれらを復元しません。

于 2008-11-07T01:46:49.740 に答える
0

ファイルに拡張子がないため、cmdはそれを存在しないディレクトリのように扱いますか?

于 2008-11-04T14:20:03.187 に答える
0

コマンド拡張機能が無効になっている場合、for コマンドの (set) パラメータはファイルでなければなりません。

コマンド拡張機能が有効になっている場合、for コマンドの (set) パラメータは、ファイル、文字列、またはコマンドです。

「タイプ ファイル名」の設定が失敗したクライアントのコンピューターでは、コマンド拡張機能が無効になっています。

コマンド拡張機能を有効または無効にする方法については、「cmd /?」と入力してください。

于 2008-11-04T14:30:22.620 に答える
0

待ってください...ファイル名の前後にアポストロフィが付いている可能性がありますか? MS は、ファイル名セットは二重引用符を取得し、リテラル文字列はアポストロフィを取得すると言っています。

for /F ["usebackqParsingKeywords"] {%% | %}variable in ("filenameset") do command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}variable in ('LiteralString') do command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}variable in (`command`) do command [CommandLineOptions]

もちろん、あなたがこれをしている場合を除きます。

ファイル名セットを一重引用符で囲んで括弧で囲むことにより、即時文字列に対して for /F 解析ロジックを使用できます (つまり、'filenameset')。Filenameset は、ファイルからの 1 行の入力として扱われ、解析されます。

于 2008-11-04T17:26:02.263 に答える