私自身のスクリプトで何度も見た一般的な問題、つまりファイルパスにスペースがないことを予期していないことに遭遇した可能性があります。
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つのことを行います。
- そのスクリプト内で設定または変更した環境変数が呼び出し元の環境に影響を与えないようにします。
- コマンド拡張機能が有効になっていることを確認します。コマンド拡張機能は優れています
洗練された便利なスクリプトをバッチで作成して友達に感動を与えたい場合(かつては不可能と考えられていたタスク)、これらの各コマンドに埋め込まれたドキュメントを注意深く読み、理解してください。
本当に良いスクリプトを書くために、これらのコマンドが提供しなければならないあらゆるトリックとニュアンスを利用する必要があります。
次に例を示します。このset
コマンドは、多くのタスクに使用できます。
簡単な割り当て:
set myDir=C:\Foo
数学の実行:
set /a myCount=myCount + 1
入力のプロンプト:
set /p myColor=What is favorite color
サブストリングの抽出:
set myCentury=%myYear:~0,2%
これが私があなたのスクリプトを書いた方法です
@echo off
setlocal EnableExtensions
if exist "%MyDir%\tmp" (
echo Folder exists
) else (
echo Folder does not exist
)
幸運と幸せな狩猟。