月別アーカイブ: 2020年7月

17.【MORE】画面単位で区切って表示する

とても長いテキストファイルや、出力データが膨大な処理結果をコマンドプロンプトで表示させると、出力状況に応じてどんどんスクロールしていき、最後には画面バッファ量を超えると、一行目から順にデータが削除されていきます。

MOREコマンドは入力を受け付けると、画面サイズで区切って順に出力してくれます。そのためスクロールで内容が読めなくなることもありませんし、データ量が多すぎて、データが消えてしまうこともありません(DIRコマンドの/pスイッチのような働きをします)。

使い方としては、通常のコマンドのようにファイルを指定して表示させる方法と、パイプ機能を利用してMOREにコマンドの処理結果を読み込ませて、ページごとに表するように再処理することもできます。

書式: MORE [スイッチ] [パス]ファイル名 ※通常使用
例: MORE more-text.txt 
書式: MORE [スイッチ] < [パス]ファイル名 ※リダイレクトを使用した場合
例: MORE < more-text.txt
書式: コマンドA | more [スイッチ] ※パイプを使用した場合
例: DIR /S | more

書式はどういうシーンでMOREコマンドを使用するかによって違ってきます。最初の書式は通常のファイルを指定する方法、2つ目の書式はリダイレクトを使って標準入力をファイルに切り替えて表示する方法、3つ目はパイプ機能を使ってコマンドの標準出力をMOREの入力に接続してデータを再処理する方法です。目的に応じて柔軟にデータの選択ができるので便利ですね。

複数のファイルを開く

MOREは複数ファイルの表示に対応しています。

> MORE Multiple1.txt Multiple2.txt

のように半角スペースで区切ってファイルを指定します。ファイルがカレントディレクトリにない場合は、それぞれのファイルごとにパスが必要になります。

> MORE Documents¥Multiple1.txt Document¥Multiple2.txt

複数ファイルを指定した場合は、最初に指定したファイルから順に表示されます。1ファイル目を表示し終えたら2ファイル目という具合です。ファイルを表示している途中で2ファイル目を表示したい時は、「F」キーを押します。

スイッチ一覧

オプションの種類機能
/e拡張機能を有効にする(デフォルトはONの状態)
/Cページを表示する前に画面を消去する
/Pフォーム フィード文字を展開する
/S複数の空白行を1行に縮小する
/Tnタブをn個のスペースに置き換える(既定値は8)
/+n最初のファイルをn行目から表示する
※ nは数字が入ります。

キー操作一覧

オプションの種類機能
P n次のn行を表示する
S n次のn行をスキップする
F次のファイルを表示する
Q終了する
=行番号を表示する
?ヘルプを表示する
<space>キー次ページを表示する
<return>キー,<enter>キー次の行を表示する
コマンド実行後 — More(00%) — と表示されているときにキーを押す。

スイッチの/eですが、コマンドプロンプトの設定を変更していない限りはデフォルトでONになっていますので、通常使用することはありません。

/Cは現在表示されている内容を消去しますから、保存されていない内容を表示している時は注意が必要です。消去することで画面バッファをある程度確保する効果が見込めます。

/Sは複数にわたる空白行を1行にまとめてくれます。普段は/Sオプションをつけて作業しても良いでしょう。特にパイプ機能などを使ってSORTコマンドを使用した場合など、空白行が数十行続いて表示されたりしますので、そういうときには是非使いたいスイッチです。

/Tnは/T4などと記述して使用します。タブによるインデントをスペースによりインデントに置き換える際にスペースの個数を指定します。コード系のテキストを表示させるときに、TABのままではうまく画面表示できない時などに使用します。

/+nは/+100などと記述して使用します。指定した行数から表示します。

上記のオプションでは/s,/+nを覚えておくと、便利に使えると思います。その他のオプションはそれぞれの使い方に合わせて覚えていくといいでしょう。

MOREコマンドはDIRの/Pオプションを使うよりさらに細かな設定や操作ができるようになっています。簡易的に使用するなら/Pオプションでもいいですが、機能不足を感じるときにはパイプ機能を使ってMOREコマンドに渡した方が使いやすいでしょう。

16.パイプ 複数のコマンドを一度に実行する

前回の15.リダイレクト 入出力先を変更するでは、標準の入出力先をファイルに切り替えて、テキストファイルを読み込んだり、テキストファイルに書き込んだりしました。勘違いをしていけないのは、これは、テキストファイルを読み書きする機能ではなく、標準入出力(+エラー出力)を切り替える機能だということです。

さて、ここで「A」というコマンドで処理したテキストデータを「B」というコマンドさらに処理を加えたいとしたらどうすればいいでしょうか?

まず思いつくのが、「A」の処理結果をテキストで出力しておいて、次に「B」で保存したテキストデータを読み込んで処理をするという方法でしょうか?これなら前回のリダイレクトを使えばどうにかできそうです。

では、一度に「A」が処理した結果を、直接「B」が受け取って処理できないものでしょうか?これを実現するのがパイプ機能です。

パイプはコマンドAの出力をコマンドBの入力に接続します。蛇口にホースを繋いで、ホースの反対側をシャワーヘッドにつなぐイメージです。データはコマンドAの出力を出て、パイプを通り接続されたコマンドBの入力に渡されます。コマンドBは渡されたデータを元に新たに処理を開始します。これがパイプ機能の働く流れになります。

書式:コマンドA | コマンドB

コマンドA(必要なスイッチやオプションとともに) とコマンドB(こちらも同様)の間に半角スペースで区切って「|」パイプ記号を入力します。パイプ記号は一般的なJISキーボードならSHIFTキーを押しながら¥記号のキーを押します。USキーボードならSHIFTキーを押しながら\キーを押します。

パイプはコマンドAが標準出力へ出力したデータを、コマンドBの標準入力へ渡します。その後、コマンドBはその値を処理して標準出力へ実行した結果を出力します。今回の書式では2つのコマンドを接続していますが、この後パイプ記号を使うことで幾つでもコマンドを接続することができます。

注意するべき点は、コマンドAには出力するデータを持つコマンドを配置する必要があり、右側にはそのデータを受け取るための入力を持つコマンドを配置しなければいけない点です。

パイプ機能の例としては、大量のテキストを表示する場合。
DIRコマンドの/pオプションのような機能があれば便利ですが、必ずしもどのコマンドもこいったスイッチを持っているとは限りません。そういうときパイプ機能を使って、テキストデータをページごとに表示する「MORE」コマンドの入力としてDIRの出力を接続してやれば、1画面ごとにデータを分割して表示することができます。

例:
> dir /s | more

処理の流れとしては、まずDIRコマンドの標準出力がパイプの右側のMOREコマンドの標準入力となり、MOREコマンドで処理されたデータが標準出力であるディスプレイに表示される。

MOREコマンドのようにデータを受け取って再処理をすることのできるコマンドのことをフィルターコマンドなどと呼びます。以下にそのほかのフィルターコマンドを紹介します。

  • MORE テキストデータをページ分割して表示します。
  • FIND テキストデータ内から指定した文字列を検索する。
  • SORT テキストデータを行ごとに比較して行の並べ替えをする。

15.リダイレクト 入出力先を変更する

リダイレクト」とは本来の出力先や入力元とは異なるデザインすに出力や入力に切り替えることを言います。

リダイレクト機能を使えば、通常、コマンドプロンプトのウインドウに表示(出力)されるテキストをファイルに出力したり、キーボードでデータなどを入力するところをファイルを開いて取り込むことができます。

標準入力と標準出力、標準エラー出力

コマンドは必要に応じてデータを受け取ったり、処理した結果をウインドウ内に表示したりします。この「データを受け取る」ことを入力、データをウインドウなどに渡すことを出力と言います。さて、Windowsのみならず大抵のシステムは入出力に標準的なデバイス(周辺機器のこと)を設定しています。

入力用のデバイスであればキーボードで、これを標準入力と言います。また出力用のデバイスであればディスプレイ(Windowsでは各ウインドウに当たります。)で、これを標準出力と言います。コマンドは特に指示のない場合、標準入力であるキーボードからデータを受け取り、処理した結果を標準出力であるコマンドプロンプトのウインドウにデータを渡します。これらデータの流れをデータストリームといいます。

一般的なシステムのデータの流れ

標準入力をSTDIN(Standard input)、標準出力をSTDOUT(Standard output)といいます。また両方をまとめて標準入出力(STDIOで、Standard input output)といいます。

コマンドを実行したときにエラーが起きた場合、コマンドプロンプトは標準出力でエラーをウインドウに表示すると行ったことはせずに、別途、標準エラー出力というデータストリームを使用し、エラーメッセージをウインドウに表示させます。標準エラー出力はSTDERR(Standerd error output)と表記します。

リダイレクト記号

リダイレクトには入力元や出力先を、「線路の切り替え機」のように他のデバイスに切り替える機能があります。その機能を使って、本来キーボードから受け取る情報をテキストファイルから受け取ったり、ウインドウに表示される情報をテキストファイルに保存したりするには、リダイレクト記号を使います。

リダイレクト機能を使って、本来キーボードから受け取る情報をテキストファイルから受け取ったり、ウインドウに表示される情報をテキストファイルに保存したりするには、リダイレクト記号を使います。

リダイレクト記号には以下の3つがあります。

  • < 標準入力を他のデバイスに切り替え
  • > 標準出力を他のデバイスに切り替え
  • >> 標準出力を他のデバイスに切り替えてデータを追加する(append機能)

使い方は以下のように、まずコマンドを記述します。記述したコマンドに対してリダイレクト記号を記述します。さらに他のデバイスとして、ファイル名などを記述します。このコマンド、リダイレクト記号、デバイス名はそれぞれ半角スペースで区切ります。

例:
> DIR /S > directory-info.txt
> コマンド名 スイッチ リダイレクト ファイル名

標準出力をファイルに保存する

「>」のリダイレクト記号を使えば、本来ウインドウに表示されるコマンドの処理結果をテキストファイルなどに保存することができます。

書式:コマンド &gt; ファイル名

コマンドはスイッチやオプションなど、必要な情報を従来と同じように記述してください。リダイレクト記号は半角英数です。ファイル名はカレント以外の場所に保存する場合、パスが必要になります。

例題:カレント以下のディレクトリ情報をDocumentsディレクトリにdirectory-info.txtとして保存する。

> DIR /S > directory-info.txt

標準入力をファイルから入力する

「<」のリダイレクト記号を使えば、本来キーボードなどから入力されるデータをテキストファイルなどから受け取ることができます。

書式:コマンド < ファイル名

読み込むファイルがカレントに存在しない場合はパスが必要になります。

例題:カレント以下のディレクトリ情報を照準で並べ替える

> dir /s/a:d > directory-info.txt
> sort < director-info.txt

上記のコマンドは、1. DIRコマンドでディレクトリのみの情報を標準出力をdirectory-info.txtに切り替えて保存。2. 保存したファイルを標準入力を切り替えてSORTコマンドで読み込んで、並べ替えたデータをウインドウに表示します。

さらに並び替えたデータをdirectory-info-sorted.txtとして保存する場合は、

> dir /s/a:d > directory-info.txt
> sort < director-info.txt > directory-info-sorted.txt

というふうに、さらに「>」をつけてその後に保存したいファイル名を記述しましょう。

標準出力の内容を既存のファイルに追加する

「>>」のリダイレクト記号を使えば、本来ウインドウに表示されるコマンドの処理結果を「既存の」テキストファイルなどに追加して保存することができます。

書式:コマンド >> ファイル名

例題:リダイレクトを使用して作成したテキストファイルにデータを追加保存する

> dir pictures > directory-info.txt
> dir Documents >> directory-info.txt
> dir Music >> directory-info.txt

まず、Picturesディレクトリ内の情報がdirectory-info.txtにファイルとして保存され、次にDocuments内の情報がdirectory-info.txtに追加して保存される。最後にMusicの内容がdirectory-info.txtに保存されるため、テキストファイルの内容はPictures、Documents、Musicの順で保存されます。

 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は 7EEF-2850 です

 C:¥Users¥kobedenshi¥Pictures のディレクトリ

2020/07/06  14:12    <DIR>          .
2020/07/06  14:12    <DIR>          ..
2020/07/06  14:12    <DIR>          Camera Roll
2020/07/06  14:12    <DIR>          Screenshots
               0 個のファイル                   0 バイト
               4 個のディレクトリ  85,910,163,456 バイトの空き領域

 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は 7EEF-2850 です

 C:¥Users¥kobedenshi¥Documents のディレクトリ

2020/06/16  23:09    <DIR>          .
2020/06/16  23:09    <DIR>          ..
2020/06/16  23:09    <DIR>          Applications
               1 個のファイル               5,016 バイト
               3 個のディレクトリ  85,910,159,360 バイトの空き領域

 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は 7EEF-2850 です

 C:¥Users¥kobedenshi¥Music のディレクトリ

2020/06/13  17:42    <DIR>          .
2020/06/13  17:42    <DIR>          ..
               0 個のファイル                   0 バイト
               2 個のディレクトリ  85,910,159,360 バイトの空き領域

コマンド実行時のエラーを保存する

コマンドを実行したときエラーが出て、コマンドが正しく終了しないと標準エラー出力を通してウインドウにエラーが表示されます。標準出力をテキストファイルに保存するのと同様に、標準エラー出力をテキストファイルに保存、またはアペンドを使用して追加保存します。

標準出力を切り替えるには「>」記号を使いましたが、標準エラー出力は単に「>」記号を使っても標準出力が保存されるだけで、エラーメッセージは表示されません。標準エラー出力を保存するには以下のように記述する必要があります。

書式:コマンド 2> ファイル名

リダイレクト記号の前に「2」という数字がついているのが分かります。この数字をファイルハンドルと言います。標準入力、標準出力、標準エラー出力にはこのファイルハンドルが設定されていて、リダイレクト記号につけることで特定のデータストリームだけをリダイレクトすることができるようになります。ファイルハンドルの種類は以下の通りです。

  • 0 stdin 標準入力
  • 1 stdout 標準出力
  • 2 stderr 標準エラー出力

このファイルハンドルを使用すると標準エラー出力であるエラーメッセージもテキストファイルに保存することができます。

> DIR document 2> dir-err.txt

この場合、リダイレクトを使用しないとウインドウに「ファイルが見つかりません」とエラーが表示されますが、エラー出力をファイルハンドルで指定して、dir-err.txtにリダイレクトしているためにウインドウには何も表示されず、エラーメッセージはdir-err.txtに保存されます。

では、その場合、標準出力はどうなっているのでしょうか?

上記のコマンドでは標準エラー出力のみをリダイレクトしているため、標準出力である「ドライブC〜」のメッセージは保存されません。それでは標準出力と標準エラーメッセージを同じファイルに保存するにはどうすればいいのでしょうか?
答えは以下の通りに記述します。

> DIR document > dir.txt 2>&1

最後のファイルハンドル操作で標準エラー出力と標準出力を結合しているのです。「>&」は複数のデータストリームを結合することができます。上記のコマンドの実行結果は以下の通りとなります。

 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は 7EEF-2850 です

 C:¥Users¥uotaa のディレクトリ
ファイルが見つかりません

通常のDIRの出力と「ファイルが見つかりません」というエラー出力が両方とも保存されていますね。

14.ワイルドカードとは

コマンドラインでファイル名を指定する際には、ワイルドカードという代替え文字を利用することができます。ワイルドカードは、同じようなファイル名を一括して指定できる便利な機能です。

ワイルドカードは「*」や「?」という2つの記号を指し、複数のファイルなどまとめて指定する際に使用します。

  • 「?(クエスチョン)」……任意の一文字(0文字、または1文字)を代替
  • 「*(アスタリスク)」……任意の複数文字(0から任意の文字数)を代替

「?」記号は任意の0文字〜1文字を代替するので、例えば次のようなDIR test?.txtというコマンドを実行すると、先頭にtest最後に.txt間に0または1文字のファイル名が適合しますね。DIR test??.txtの場合、先頭にtest、最後に.txt、間に0または2文字のファイル名が適合しますね。

つまり、ワイルドカードを使用する事によって複数のファイルに対する条件のようなものを指定することができます。また、ファイル名に適合することを「マッチ」するというので、覚えておいてください。

> DIR test?.txt

上記のコマンド場合、カレントディレクトリからファイルの名の最初がtest、最後が.txtで間に0文字または1文字が入るファイルのみ表示する事になります。実際にマッチするファイル名の例を挙げてみると以下のようになります。

  • test.txt  (間の1文字が0文字の場合)
  • test1.txt  (間の1文字が”1″の場合)
  • text2.txt  (間の1文字が”2″の場合)
  • test!.txt  (間の1文字は記号でも構わない)
> DIR test??.txt
  • test.txt
  • test1.txt
  • text02.txt
  • test_1.txt

など、「?」を2つ続けて入力すると0文字から2文字分の文字を代替します。最初がtestで最後が.txt、間に0,1,2文字入るという条件になります。

次に「*」は0文字または何文字でも代替します。例えば次のようなコマンドを入力すると

> DIR *.txt

最初は何文字かわからないが、最後は.txtが入ってるファイル名となり、拡張子.txtを持ったテキストファイルのみ表示するといったコマンドになります。

アスタリスクは共通のキーワードや拡張子を持ったファイル名を探すのによく使われます。上記のコマンドでマッチするファイル名は

  • SAMPLE.txt
  • schedule.txt
  • setuplog.txt

など、拡張子が.txtであれば、他の部分は0文字から何文字でも良いので、大抵のファイル名でマッチします。

さらに「*」記号をファイル名の中間に指定すると、前後に任意の文字列を持つファイルを指定することができますし、例えばDIR *set*を実行するとファイル名のどこかに「set」という文字があるファイルを表示することができます。

ただし「*」+「数字」というパターンで使用する場合は、ロングファイルネームだけでなくショートファイルネームも検索が行われます。例えば「DIR *1.txt」のように指定すると「abcdef1.txt」がマッチするだけでなく、「shuwas~1.txt」といったショートファイルメームもマッチしてしまいます。これは「」+「数字」+「」のパターンでも同様のことが起こります。

ショートファイルネームとは

普段Windowsで使用しているファイル名の命名規則を「ロングファイルネーム」といいます。ロングファイルネームのルールとしては

  • 250文字までのファイル名
  • ドライブ名やディレクトリ名を含むパス全体で259文字
  • ¥ , / , : , *, ? , ” , < , > , ¥ などの記号はファイル名に含められない
  • ファイル名の最初に . をつけたファイル名は不可
  • 大文字、小文字の区別はしない

などのルールがあります。

これに対してもう一つの命名規則で「ショートファイルネーム」があります。ショートファイルネームはMS-DOS時代の名残で、Windowsでロングファイルネームが使用された時、自動的にシステムが生成する名前です。そのルールとして、

  • 半角英数字8文字 . 拡張子3文字

俗に8 + 3形式と呼ばれるファイル名の形式になります。

13.【MOVE】ファイルを移動する

MOVEコマンドはファイルを移動します。エクスプローラーではファイルアイコンをドラッグ&ドロップして別のフォルダに移動。または、ファイルを右クリックして「切り取り」、別のフォルダに移動して「貼り付け」するのも結果的にMOVEと同じになります。

また、MOVEはファイルを同一のディレクトリに「移動」し、移動とは別の目的に使用もします。それではMOVEコマンドの書式を見てみましょう。

書式:MOVE [スイッチ] 移動元ファイル 移動先ディレクトリ
> MOVE Documents¥mv-text.txt Documents¥Application

スイッチ一覧

オプションの種類機能
/y移動先にある同名ファイルを上書きするかどうかのメッセージを表示しない。
/-y移動先にある同名ファイルを上書きするかどうかのメッセージを表示する。初期値は「/-y」。これらは環境変数COPYCMDに設定可能

スイッチは2種類というより、/yの1種類です。スイッチがない場合は/-yのスイッチが付いているものとして認識されます。また/yが付いていると上書きをしてもいいかどうかの確認をしなくなりますので、バッチファイルなどの自動実行でもない限りな使わない方がいいでしょう。

次のオプションは「移動元ファイル」です。MOVEはファイルを移動するためのコマンドなので基本は移動したいファイルを指定します。カレントにないファイルを指定する場合は移動元ファイルの前にパスを指定しましょう。

最後に「移動先ディレクトリ」を指定しましょう。当然ですが移動先ディレクトリの場所にファイルをしてすることはできません。またカレントにない場合は、パスを指定します。

> MOVE mv-text.txt Documents

上記のコマンドはカレントにあるmv-text.txtをDocumentsディレクトリに移動します。ちなみに移動先ディレクトリがカレントディレクトリでしたら省略が可能です。

> MOVE Document¥mv-text.txt (省略)

この場合は移動先ディレクトリが省略されていますので、Documentsディレクトリにあるmv-text.txtがカレントディレクトリに移動されます。

では、移動元ファイルにディレクトリを指定するとどうなるでしょう?

> MOVE Document¥mv-directory Application

移動元ファイルを指定するところにmv-directoryというディレクトリを指定しました。この場合mv-directoryの中にあるディレクトリやファイルごとApplicationに移動してくれます。

ファイル名を変更する

コマンドプロンプトにはファイル名を変更するための「REN,RENAME」というコマンドが用意されていますが、MOVEコマンドを使用してもファイル名の変更はできます。

書式:MOVE 変更元ファイル名(またはディレクトリ名) 変更先ファイル名(またはディレクトリ名)

他のOSなどのコマンドライン環境を使用することを考えてもMOVEコマンドでの名称変更の方法は知っておいた方がいいでしょう。

MOVEコマンド使い方は「移動元ファイル」を「変更元ファイル名」に、「移動先ディレクトリ」を「変更先ファイル名」にします。「移動元ファイル」を「変更元ディレクトリ名」、「変更先ファイル名」を「変更先ディレクトリ名」とすることでファイルだけでなくディレクトリ名も変更できます。

もちろんMOVE本来の「ファイルを移動する」機能は有効なので、パスを記述すると、ファイルを移動するのと同時にファイル名を変更することもできます。