web-dev-qa-db-ja.com

バッチファイル、PING、エラーレベル、> nullそれらは何をしますか?

これは本当に簡単な質問のようです(Windows 7を実行している)。しかし、私は答えを探しましたが、Microsoftのサイト( XP PINGEverything other PING )またはGoogle検索の束からは何も見つかりませんでした。

私はDOS /バッチファイルを学んでいます。私の最初のコードは、サーバーにPINGすることです。

コマンドプロンプトにこれを入力すると、正常に実行され、いくつかの結果が得られます

PING -n 1 Server04

結果:

Pinging Server04.aaaa.xxxx.net [x.x.x.x] with 32 bytes of data:     
Reply from x.x.x.x: bytes=32 time=1ms TTL=125

これをバッチファイルで実行すると、停止することはありませんが、-n(または/ n)はPINGを1回だけ送信し、PAUSEも停止してcmd.exeウィンドウを開いたままにする必要があります。

PING -n 1 winsvmnsdev04
PAUSE

結果:

C:\Users\Me\Desktop>PING -n 1 Server04
C:\Users\Me\Desktop>PING -n 1 Server04
C:\Users\Me\Desktop>PING -n 1 Server04
Continues until I use Ctrl + C

私はたくさんのQ&Aを見てきましたが、その多くには応答をエコーするための「errorlevel」と、末尾に「> null」があるものが含まれています。理解しようとして、私は調べましたが、どちらもMicrosoftライブラリの「PING」の属性としてリストされていません。

走ると

PING -n 1 winsvmnsdev04 > null
PAUSE

または実行

PING -n 1 winsvmnsdev04 > null

私は1行を取得します

C:\Users\Me\Desktop>PING -n 1 Server04  1>null

理由がわかりません。誰かがPINGのこれら2つの属性を説明したり、公式文書を指摘したりできますか? /nおよび-n1つのPINGに限定しないでください。>nullおよびPAUSEは、PINGがワイルドに実行されている場合は機能しません。これらはいずれも、Microsoftのドキュメントで説明されている内容と一致していません。

注:errorlevelコマンドラインリファレンス としてMicrosoftによってリストされていません

1
James Jenkins

バッチファイルにping.batという名前を付けたのではないかと思います。これは、説明したように ここ が問題の原因になります。

これが実際に当てはまる場合、何が起こっているのかというと、pingは実際にはpingコマンドを実行していませんが、ping.batはこれらの引数を使用しており、無限再帰になります。あなたがそれを壊すまで終了します。

バッチファイルを実行すると、コマンドが出力なしでコマンドプロンプトで常に繰り返されるのはそのためです。これは、実際にはpingコマンドを実行しているのではなく、それらの引数を使用してコマンドを呼び出し、それが自分自身を呼び出しているためです。 -まあ、あなたは絵を手に入れます。


> null部分はリダイレクト; >演算子は、プログラムの出力がコンソールではなく次のファイルに書き込まれることを意味します。特別なファイル名nulnullではない)は、Windowsによって内部的に処理されます。あなたがそこに書いたものはすべて単に捨てられます。このようにして、スクリプトはプログラムを実行し、コンソールを乱雑にすることなく、プログラムが成功したかどうかを確認できます。 (同様に、<はファイルからの入力をリダイレクトします。)

1>>の完全な形式であり、「最初のファイル記述子をリダイレクトする」ことを意味します。

  • Unixライクなオペレーティングシステムでは、ファイル記述子は、プログラムが現在開いているファイルを参照するためにプログラムによって使用される番号です。慣例により、ファイル記述子0、1、2は、「標準入力」(stdin)、「標準出力」(stdout)、および「標準エラー出力」(stderr)に対応します。大きい数字はすべて、プログラム自体が開いたファイルに対応します。

  • Windowsは多くの点でこれとは異なります。「ファイルハンドル」を使用し、番号を付けていません0-1-2-3 ...ほんのわずかな違いです。ただし、cmd.exeスクリプトインタープリターは1>2>を理解しており、通常の出力とエラー出力のリダイレクトを意味します。これにより、Linuxやその他のUnixからのユーザーにとっては少し簡単になります。 -いいね。


errorlevelに関しては、コマンドではなく、 if コマンドのモードです。各プログラムは、終了すると、「終了ステータス」と呼ばれる番号をシステム(および親プログラム)に返します。慣例により、0は成功を意味し、≥1はある種の失敗を意味します。

  • cmd.exeでは、特別な%errorlevel%変数を使用して、最後のコマンドの終了ステータスにアクセスできます。次に例を示します。

    if %errorlevel% NEQ 0 echo The previous command failed!
    
  • 特別な変数を持たない古いWindowsおよびMS-DOSバージョンからの別の構文があります。終了ステータスが指定された数に等しいかより大きいかより大きいかどうかをチェックします。

    if errorlevel 1 echo The previous command failed!
    
10
Pockets