2012-03-12 5 views
2

私は1つのWindows Server 2008 R2では動作しますが、別のものでは動作しないDOSビルドスクリプトを持っています。コマンドラインで次のいずれかの入力壊れたマシン上の症状を確認するには:コマンドラインFOR/Fが失敗する

for /f %X in ('dir /b *.txt') do @echo %X 
for /f "usebackq" %X in (`dir /b *.txt`) do @echo %X 

することはできます:「『DIR/B * .TXT』は、内部コマンドまたは外部コマンドとして認識されません。」例えば。

for %X in (*.txt) do @echo %X 

が正しく動作しているため、/ fに正しく従っていません。私はこれがコマンド拡張機能ではないと考えています(cmd/xを起動すると同じ動作を示しますが、問題のサーバーでcmd/yを実行すると "/ fはこの時点で予期せぬものでした")。また、コマンド拡張レジストリキーをチェックし、バッチファイルで "setlocal enableextensions"を試しました。

私はそれは関係ないと思っていますが、サーバー間の違いは、失敗したものが物理的であることです。そのCPUにはVT拡張がありません。 McAfeeがインストールされていますか?私が知っている限り、彼らは異なった時に同じ方法でインストールされました。

誰にも提案はありますか?ハマった!

+0

コマンドライン拡張機能が有効になっていないようです。 forループを実行する前に 'setlocal enableextensions'を試してください。 – Stefan

+1

ありがとうございますが、私はそれを試みました(errorlevelは0です)。 –

答えて

2

チェックそれが動作しないマシン上でCOMSPEC環境変数、すなわちecho %COMSPEC%を行うと、それが含まれているものを参照してください(これは%windir%\system32\cmd.exeまたは匹敵する必要があります)。

ロングストーリー:

あなたはsetlocal enableextensionsをいじるような(コマンドラインと比較して、バッチファイル内%%Xの代わり%Xを使用する必要のような)他のすべての潜在的な可能性を、詳細な質問を除外しています(または同等のスイッチ、レジストリエントリなど)。そして、ところで、エラーメッセージは収まりません。

「...内部または外部コマンドとして認識されません」というエラーメッセージが表示された場合、そのCMD.EXEは実行しようとしているコマンドを見つけることができません。もちろん、 "dir"は内部コマンド "これは決して起こらないはず"なので、もちろんです。

私は次のことをやって、あなたのエラーを再現することができた:

  1. スタートCMD.EXE
  2. すなわちCMD.EXEセッション、ネストされた、別のを開始し、次CMD.EXEを入力し、次のSET ComSpec=DoesNotExist
  3. を入力します。実行中のCMD.EXEセッションでは、この手順が必要です。ComSpecへの変更が気付かれないようです。
  4. 新しいCMD.EXEセッションでコマンド(例:for /F %x in ('dir /b') do @echo%x)を入力すると、表示されるエラーが発生するはずです。 dirと入力するだけで動作しますので、例えばforというループを介して「間接的に」実行する必要があります。面白い。これは、すべてあなたが見ているものを再現するために行われたことを

注意、あなたのシステムにこの動作につながる正確な環境や設定条件が異なる場合があります理由から、ComSpec環境変数は、他の何かを指していることが事実CMD.EXEは同じである必要があります。

+0

興味深いことに、reproは良いマシンでの症状ですが、%comspec%はどちらの場合もC:\ Windows \ System32 \ cmd.exeです。文脈が関連している場合、悪い機械は良い機械とは違ってDCとして設定されます。問題は(ドメイン)管理者に起こります。すべてのアクセスはrdpではなくコンソール上にあります。デバッグのためには、cmd.exeをどこかにコピーして、パーミッションを直接設定し、comspecをポイントするのが理にかなっていますか?私はそれを与えるだろう。 –

+0

@StuartBrown '%ComSpec%'の値はどこで確認しましたか?問題が発生したシェルで直接? –

+0

はい、私はちょうどスタート - >タイプcmd - > 'エコー%comspec%'と残念ながら、それはすべて見事に見えます。 '%comspec%'は、dirが動作するネストセッションを開始します。 - 両方のマシンでバージョン6.1.7601を使用し、cmd.exeをどこかにコピーしてcomspecを指定すると、同じ状況になります。 –

1

バッチファイルでは、二重パーセント、つまり%% Xを使用する必要があります。 コマンドラインで1つのパーセンテージが正常です。

なぜ、1台のマシンで動作しているのでしょうか、確かではありません。何とか16ビットDOS経由で動作していますか?あるいは、それは、可変置換が働かずに動作するように見える別のテストでした。

+0

これは間違いありませんが、OPは明示的に彼がコマンドラインでそれをテストしたと言っています。 –

+0

申し訳ありません私の悪い..単に "dir/b * .txt"作業を実行しています(それはすべきです)。 –

+0

はいdirはforの外側で正常に動作します。 –

関連する問題