1

フォルダの存在をテストしていますが、その存在に応じて、さまざまなコマンドを実行したいと思います。

DIR %MYDIR%\tmp > test.txt
IF ERRORLEVEL 1 (
      echo/FOLDER DOES NOT EXIST
) else (
      echo/FOLDER EXISTS
      )

問題は、フォルダが存在しない場合、標準の出力に加えて次のエラーが発生することです。

The system cannot find the file specified.

エラーが発生せずに正しい出力を表示したいのですが。

4

3 に答える 3

3

これはどう:

DIR %MYDIR%\tmp > nul 2>&1

"> nul"は、標準出力をファイルnul(ビットバケット)にリダイレクトすることを意味します。

「2>」は、標準エラー(記述子2)をリダイレクトするために使用されます。したがって、「2>&1」は、標準エラーを標準出力を意味するようにリダイレクトするために使用されます(記述子1-したがって、>nullと1>nullは同じです)。または、「2>nul」を使用することもできます。

于 2012-06-16T02:14:35.223 に答える
2

私自身のスクリプトで何度も見た一般的な問題、つまりファイルパスにスペースがないことを予期していないことに遭遇した可能性があります。

MYDIR環境変数の値には、スペースが含まれている可能性があります。パスにスペースがある場合、スペースはパラメーターを区切るために使用されるため、ほとんどのコマンドはそれを複数のパラメーターと見なします。したがって、あなたの場合、MYDIRがその場合C:\Documents and Settings\Jim\My Documents、スクリプトはいくつかのパラメータでディレクトリリストを実行しようとします。

  • C:\ Documents
  • Settings \ Jim \ My
  • ドキュメント

コマンドプロンプトでこれを試してください。

C:\> mkdir learn

C:\> cd learn

C:\learn> mkdir peas and carrots

C:\learn> dir

 Volume in drive C is OS
 Volume Serial Number is 7199-C950

 Directory of C:\learn

10/03/2012  07:26 PM    <DIR>          .
10/03/2012  07:26 PM    <DIR>          ..
10/03/2012  07:26 PM    <DIR>          and
10/03/2012  07:26 PM    <DIR>          carrots
10/03/2012  07:26 PM    <DIR>          peas

うーん、「peas」、「and」、「carrots」という名前の3つのフォルダ(dirコマンドの好みに応じてアルファベット順に並べ替えられています)。名前にスペースが含まれるフォルダーを作成するには、フォルダー名を引用符で囲む必要があります。

C:\learn> mkdir "peas and carrots"

C:\learn> dir

 Volume in drive C is OS
 Volume Serial Number is 7199-C950

 Directory of C:\learn

10/03/2012  08:10 PM    <DIR>          .
10/03/2012  08:10 PM    <DIR>          ..
10/03/2012  07:26 PM    <DIR>          and
10/03/2012  07:26 PM    <DIR>          carrots
10/03/2012  07:26 PM    <DIR>          peas
10/03/2012  07:29 PM    <DIR>          peas and carrots
               0 File(s)              0 bytes
               6 Dir(s)  49,670,320,128 bytes free

この問題を修正するには、ファイル/フォルダーのパスを引用符で囲みます。

DIR "%MYDIR%\tmp" > test.txt

system cannot find the file specifiedこれにより、ファイル存在する場合でも問題が解消されます。

残念ながら、ファイル/フォルダが実際に存在しない場合は、同じエラーメッセージが表示されます。このためのコマンドの使用に固執する場合は、ストリームDIRをリダイレクトする必要があります。リダイレクト演算子を使用しstderrて既にリダイレクトしています。同じファイルにリダイレクトするには、コマンドは次のようになります。stdout>stderr

DIR "%MYDIR%\tmp" > test.txt 2>&1

バッチファイルの出力メッセージに基づいて、%MYDIR%\ tmpが存在するかどうかを判断することだけに関心があり、test.txtというファイルに%MYDIR%\tmpのディレクトリリストを残したくないと想定しています。現在の作業ディレクトリにあります。ファイル/フォルダが存在するかどうかを単にチェックしている場合、DIRコマンドを使用することはかなり悪い選択です。%MYDIR%\ tmpがフォルダーの場合、スクリプトはそのフォルダー内のすべてのファイルのディレクトリ情報を取得するのに時間を浪費します。そのフォルダに何千ものファイルがある場合、顕著な遅延が発生する可能性があります。さらに、test.txtという名前のファイルを現在の作業ディレクトリに保存しました。このファイルは、スクリプトを終了する前に削除する必要があります...ご存知のとおり...そもそもそのファイルが本当に必要ではなかったと仮定します。

フォルダまたはファイルが存在するかどうかを知りたいだけの場合は、はるかに優れた選択肢があります。このif existコマンドは、ニーズに完全に適合しています。コマンドの詳細を確認するifには、Windowsのコマンドプロンプトウィンドウで次のように入力します。if /?

例:

C:\> if /?
Performs conditional processing in batch programs.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

一見したところ、ドキュメントはファイルのみで機能することを示しif existていますが、ファイルだけでなくフォルダでも機能するので安心してください。

コマンドのドキュメントを読んでいるとif、「コマンド拡張機能が有効になっている場合...」というフレーズに出くわすことがあります。ほとんどのシステムでは、コマンド拡張機能はデフォルトで有効になっていますが、スクリプトの2行目を作成したいと思いますsetlocal EnableExtensions。最初の行はです。これは、デバッグが完了するまで@echo offすぐにに変更されます。rem @echo off

このsetlocal EnableExtensionsコマンドは2つのことを行います。

  1. そのスクリプト内で設定または変更した環境変数が呼び出し元の環境に影響を与えないようにします。
  2. コマンド拡張機能が有効になっていることを確認します。コマンド拡張機能は優れています

洗練された便利なスクリプトをバッチで作成して友達に感動を与えたい場合(かつては不可能と考えられていたタスク)、これらの各コマンドに埋め込まれたドキュメントを注意深く読み、理解してください。

  • もしも
  • セットする
  • 電話
  • にとって
  • cmd

本当に良いスクリプトを書くために、これらのコマンドが提供しなければならないあらゆるトリックとニュアンスを利用する必要があります。

次に例を示します。このsetコマンドは、多くのタスクに使用できます。

  1. 簡単な割り当て:
    set myDir=C:\Foo

  2. 数学の実行:
    set /a myCount=myCount + 1

  3. 入力のプロンプト:
    set /p myColor=What is favorite color

  4. サブストリングの抽出:
    set myCentury=%myYear:~0,2%

これが私があなたのスクリプトを書いた方法です

@echo off
setlocal EnableExtensions

if exist "%MyDir%\tmp" (
    echo Folder exists
) else (
    echo Folder does not exist
)

幸運と幸せな狩猟。

于 2012-08-07T01:57:35.557 に答える
0

exist代わりに使用してください:

@echo off
if exist %MYDIR%\tmp (
  dir %MYDIR%\tmp > test.txt
  goto EndIt
)
echo %MYDIR%\tmp not found > test.txt
:EndIt
于 2012-06-16T02:17:23.280 に答える