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

20.環境変数について

環境変数とはOSなどのシステムが提供する情報共有の仕組みをいいます。OSはOS上で動作するアプリケーションと情報共有するための簡易なデータベースを持っています。

このデータベースは変数の形をとっており「変数名=値」という書式で表すことができます。主な内容としてはWindowsの場合、Windowsのバージョンや、アプリケーションの保存場所、ユーザーディレクトリの保存場所、起動可能なファイルの拡張子などがあります。

環境変数はWindowsのみが持つものでなく、UNIX, Linux, MacなどほとんどのOSで持っていますし、OSとは異なりますが、Linuxなどで使用されるシェルや、Webでもそれぞれ独自の環境変数が使われています。

それでは、環境変数はそのようにして利用されているのでしょうか?
各OS上で動作するアプリケーション(タスクと言います)は、起動時にOSの持つ環境変数のコピーを作成し、アプリケーション内で変数の値を参照、編集を行います。通常、編集された環境変数はアプリケーション終了時に破棄されますが、必要であればOSに戻されます。

環境変数は変数を使用しますが、プログラムで使用されている変数と違って、整数や不動小数点など様々な「型」を持っていません。環境変数がサポートすることのできる型は文字列型のみとなります。

環境変数の種類や値を確認するにはコマンドプロンプトの「SET」コマンドを使用すると簡単です。コマンドプロンプトではなくWindows上で確認するには以下のようにして表示させます。

環境変数パネルを表示する

「設定」から「システム」を選択し、左ペインから「バージョン情報」を選択します。バージョン情報画面の右側に「システム情報」があるので、それをクリックします。

システム情報をクリックするとコントロールパネルの「システム」が表示されますので、右ペインにある「システムの詳細設定」をクリックします。

ここまでの過程はタスクバーの検索窓に「システムの詳細設定」と入力することで省略することもできます。

システムの詳細設定をクリックすると「システムのプロパティ」パネルが表示されるのでパネル下部にある「環境変数」をクリックします。

「環境変数」パネルが表示されました。パネル上部がユーザー環境変数で、この部分はユーザーごとに違います。下部はシステム環境変数といい、システム構成によってはあまり違いがありません。(ぼかしの部分にはパスが書かれています。詳細は皆さんの環境で確かめて下さい。)

パネルを見ると「新規」「編集」「削除」と書かれていますが、既存の環境変数を編集、削除してしまうと、アプリケーションが動かなくなったり、システムが適切に動作しなくなることがあるので注意が必要です。編集などが必要な変数名と値をよく確認してから使うようにしましょう。

また、誤って編集や削除をしてしまった時のために、環境変数のバックアップを作っておくといいでしょう。

環境変数のバックアップ

環境変数のバックアップを取るにはいくつか方法がありますが、ここではコマンドプロンプトを使った方法を紹介します。

必要なコマンドは環境変数の内容を表示するコマンド「SET」コマンドです。SETコマンドは簡単な書式で環境変数の、一覧表示、絞り込み、編集、削除ができます。次に必要となるのがリダイレクトです。

このブログをずっとご覧いただいている方ならこの時点で何をするのかわかられると思いますが、念のため説明しておきましょう。

まず、コマンドプロンプトを立ち上げて、SETコマンドを使い環境変数の一覧を表示させます。次に同じ内容でリダイレクトを使いファイルに保存します。以上でバックアップ終了です。簡単ですね!

環境変数は文字列型の変数です。変数名とその値がテキストで書き出せれば、間違って編集してしまったり、削除したとしても新規に同じ変数名、値で作り直せば元に戻すことができます。

では実際にバックアップファイルを作成してみましょう。

> SET > environment-var.txt

これでカレントディレクトリにenvironment-var.txtというファイルが作成されます。TYPEコマンドなどで内容を表示してみましょう。

> TYPE environment-var.txt
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\uotaa\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=WINDOWS10
ComSpec=C:\Windows\system32\cmd.exe
DriverData=C:\Windows\System32\Drivers\DriverData
HOMEDRIVE=C:
HOMEPATH=\Users\kobedneshi
LOCALAPPDATA=C:\Users\kobedneshi\AppData\Local
LOGONSERVER=\\WINDOWS10
NUMBER_OF_PROCESSORS=6
OneDrive=C:\Users\kobedneshi\OneDrive
OneDriveConsumer=C:\Users\kobedneshi\OneDrive
OS=Windows_NT
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Users\uotaa\AppData\Local\Microsoft\WindowsApps;;C:\Users\uotaa\AppData\Local\Programs\Microsoft VS Code\bin
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 158 Stepping 10, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=9e0a
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
TEMP=C:\Users\kobedneshi\AppData\Local\Temp
TMP=C:\Users\kobedneshi\AppData\Local\Temp
USERDOMAIN=WINDOWS10
USERDOMAIN_ROAMINGPROFILE=WINDOWS10
USERNAME=kobedneshi
USERPROFILE=C:\Users\kobedneshi
windir=C:\Windows

と、こんな感じの内容が表示されたともいます。パッと見るだけだと何が何だかわからないかもしれませんが、じっくりよーく見てみると、全て「変数名=値」で書かれていることがわかります。

例えば、最後から3行目にある「USERNAME=kobedneshi」皆さんの アカウント名ですね。「HOMEPATH=\Users\kobedneshi」はホームディレクトリのパスがHOMEPATHという変数に入っています。

全ての変数の役割がわかるようになるにはコンピュータの知識がそれだけ必要になりますが、変数名からそれぞれの意味を調べてみるのも面白いでしょう。

環境変数一覧

環境変数名意味
ALLUSERSPROFILEAll Usersのプロファイルパス
APPDATAアプリケーションデータディレクトリ
CommonProgramFilesプログラムファイル用の共通ディレクトリ
CommonProgramFiles(x86)32bitプログラムファイル用の共通ディレクトリ
CommonProgramW643264Bitプログラムファイル用の共通ディレクトリ
COMPUTERNAMEコンピュータ名
ComSpeccmd.exeの絶対パス
DriverDataドライバーデータディレクトリ
HOMEDRIVEホームドライブ
HOMEPATHホーム(ディレクトリへの)パス
LOCALAPPDATAローカルのアプリケーションデータ
LOGONSERVERログオンしているサーバ名称
NUMBER_OF_PROCESSORSプロセッサー数(CPUのCore数)
OneDriveOneDriveディレクトリ
OneDriveConsumer
OSオペレーティングシステム名称
Pathパスの一覧。登録されたディレクトリではパスなしで実行可能
PATHEXT拡張子無しで実行可能なファイル
PROCESSOR_ARCHITECTUREアーキテクチャ
PROCESSOR_IDENTIFIERCPUの詳細
PROCESSOR_LEVELCPUのFamily 値
PROCESSOR_REVISIONCPUのリビジョン
ProgramDataプログラム用データディレクトリ
ProgramFilesプログラム用ディレクトリ
ProgramFiles(x86)32bitプログラム用ディレクトリ
ProgramW643264Bitプログラム用ディレクトリ
PROMPTコマンドプロンプトの出力タイプ
PSModulePathPowerShellモジュールのパス
PUBLICPublicフォルダ
SESSIONNAMEセッション名
SystemDriveシステムドライブ
SystemRootシステムルート
TEMPテンポラリディレクトリ
TMPテンポラリディレクトリ
USERDOMAINログオンしているドメイン名
USERDOMAIN_ROAMINGPROFILEログオンしているドメイン名
USERNAMEユーザ名
USERPROFILEユーザープロファイルディレクトリ
windirWindowsディレクトリ

19.【SORT】テキストデータの行を並べ替える

SORTコマンドはASCII形式のデータを行単位で並べ替えをします。並び替えは一般にA→Zの順を「昇順」、Z→Aの順を「降順」といいます。このページでは特に指定がされていない場合は昇順で並べ替えをしています。

昇順、降順は普段から使い慣れていないと、いざというとき「あれっ?昇順だったけ?降順だったけ?」となりますので、どちらか一方をしっかり覚えておくといいでしょう。

通常使用時
書式: SORT [スイッチ] [パス]ファイル名
例: SORT sort-text.txt 
リダイレクト使用時
書式: SORT [スイッチ] < [パス]ファイル名
例: SORT < sort-text.txt
パイプ使用時
書式: コマンドA | SORT [スイッチ]
例: DIR /S | SORT

上記の例は、それぞれ「通常のコマンド使用」「リダイレクトで使用」「パイプで使用」した場合の例となります。通常使用時、リダイレクト共に入力はファイルから受け取り、出力は標準出力であるウインドウに出力していますが、パイプはDIRの実行結果を受け取って直接データを再処理しています。

SORTコマンドはMOREやFINDと同様にパイプ使用時にフィルターとして働くフィルターコマンドの一つです。並び替え作業は、多くの場合人にとっては苦痛を伴う単純作業となりますが、コンピュータにとっては得意分野の一つです。しっかり使えるようにしましょう。

スイッチ一覧

オプションの種類機能
/r逆順で並べ替える
/+n指定した桁数から並べ替える。少ない場合は他の行より前に照合される
/m並べ替えに使うメインメモリのサイズをKBで指定する
/rec numレコードの最大文字数を指定する
/o ファイル名指定したファイルに並び替えた結果を出力する

スイッチはまず「/r」「/+n」を覚えましょう。SORTコマンドは通常、昇順で並べ替えをしますので、/rを使うと昇順の逆順ですから降順で並べ替えをすることになります。

また/+nとするとnで指定した桁数の文字を基準に並べ替えを行います。指定しないと1文字目を基準に並べ替えします。

2020/07/17  09:34    <DIR>          .vscode
2020/07/24  00:48    <DIR>          3D Objects
2020/07/24  00:48    <DIR>          Contacts
2020/08/03  00:46    <DIR>          Desktop

とテキストがあった場合、月で並べ替えるなら「/+6」、日にちで並べ替えるなら「/+9」とすればいいわけです。

それでは、一度コマンドプロンプトで実行してみましょう。
まずはDIRコマンドのみ場合

> DIR
 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は C841-2070 です

 C:\Users\kobedenshi のディレクトリ

2020/07/25  14:02    <DIR>          .
2020/07/25  14:02    <DIR>          ..
2020/07/17  09:34    <DIR>          .vscode
2020/07/24  00:48    <DIR>          3D Objects
2020/07/24  00:48    <DIR>          Contacts
2020/08/03  00:46    <DIR>          Desktop
2020/07/16  23:56    <DIR>          Documents
2020/08/02  22:20    <DIR>          Downloads
2020/07/24  00:48    <DIR>          Favorites
2020/07/17  00:07    <DIR>          Intel
2020/07/24  00:48    <DIR>          Links
2020/07/24  00:48    <DIR>          Music
2020/08/03  15:28    <DIR>          OneDrive
2020/07/24  00:48    <DIR>          Saved Games
2020/07/24  00:48    <DIR>          Searches
2020/07/24  00:48    <DIR>          Videos
               0 個のファイル                   0 バイト
              16 個のディレクトリ  71,582,953,472 バイトの空き領域

となります。次に同じコマンド使用して、上記のデータをSORTに渡し、昇順で並べ替えをします。

> DIR | SORT

実行結果は以下の通りとなります。

空白行
空白行
               0 個のファイル                   0 バイト
              16 個のディレクトリ  88,045,088,768 バイトの空き領域
 C:\Users\uotaa のディレクトリ
 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は C841-2070 です
2020/07/16  23:56    <DIR>          Documents
2020/07/17  00:07    <DIR>          Intel
2020/07/17  09:34    <DIR>          .vscode
2020/07/24  00:48    <DIR>          3D Objects
2020/07/24  00:48    <DIR>          Contacts
2020/07/24  00:48    <DIR>          Favorites
2020/07/24  00:48    <DIR>          Links
2020/07/24  00:48    <DIR>          Music
2020/07/24  00:48    <DIR>          Saved Games
2020/07/24  00:48    <DIR>          Searches
2020/07/24  00:48    <DIR>          Videos
2020/07/25  14:02    <DIR>          .
2020/07/25  14:02    <DIR>          ..
2020/08/02  22:20    <DIR>          Downloads
2020/08/03  00:46    <DIR>          Desktop
2020/08/03  15:28    <DIR>          OneDrive

目立つのは、最初の数行が空白行で並び替えられていますね。次にディレクトリーのリスト以外の部分。これらの行の特徴は最初にスペースが入っていることです。昇順にした場合、スペースは数字よりも先に並び替えられることがわかります。

今回はカレントディレクトリのみの並び替え結果ですが、サブディレクトリを含むと、空白行や先頭にスペースを含む行は多くなるでしょう。場合によっては数十行も空白行が続くことになるかもしれません。そうなってしまうとデータとして見にくいものになります。

その場合、MOREコマンドの「/s」や「/+n」スイッチを併用してやると見やすくなります。例として/sスイッチを使って最初の空白行を減らしてみましょう。

> DIR | SORT | more /s

結果は以下の通りで、最初の空白行がまとめて表示されています。

               0 個のファイル                   0 バイト
              16 個のディレクトリ  88,043,945,984 バイトの空き領域
 C:\Users\uotaa のディレクトリ
 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は C841-2070 です
2020/07/16  23:56    <DIR>          Documents
2020/07/17  00:07    <DIR>          Intel
2020/07/17  09:34    <DIR>          .vscode
2020/07/24  00:48    <DIR>          3D Objects
2020/07/24  00:48    <DIR>          Contacts
2020/07/24  00:48    <DIR>          Favorites
2020/07/24  00:48    <DIR>          Links
2020/07/24  00:48    <DIR>          Music
2020/07/24  00:48    <DIR>          Saved Games
2020/07/24  00:48    <DIR>          Searches
2020/07/24  00:48    <DIR>          Videos
2020/07/25  14:02    <DIR>          .
2020/07/25  14:02    <DIR>          ..
2020/08/02  22:20    <DIR>          Downloads
2020/08/03  00:46    <DIR>          Desktop
2020/08/03  15:28    <DIR>          OneDrive

このようにフィルターコマンドは入出力を併せ持っているので、パイプを使って必要な数の処理をデータに加えていくことができます。

18.【FIND】指定した”文字列”を含む行を抽出する

FINDコマンドはファイルやディレクトリ検索用のコマンドとよく勘違いされるコマンドですが、アスキー形式のファイルの内容に対して、指定した文字列で検索をかけて、文字列を含む行だけを表示するコマンドです。ファイルがどこに保存されているか調べるにはDIRコマンドを使用します。

通常使用時
書式: FIND [スイッチ] ”検索文字列” [パス]ファイル名
例: FIND "コマンドプロンプト" find-text.txt 
リダイレクト使用時
書式: FIND [スイッチ] ”検索文字列” < [パス]ファイル名
例: FIND "コマンドプロンプト" < find-text.txt
パイプ使用時
書式: コマンドA | FIND [スイッチ] "検索文字列"
例: DIR /S | FIND ”<DIR>”

上記の例は、それぞれ「通常のコマンド使用」「リダイレクトで使用」「パイプで使用」した場合の例となります。通常使用時、リダイレクト共に入力はファイルから受け取り、出力は標準出力であるウインドウに出力していますが、パイプはDIRの実行結果を受け取って直接データを再処理しています。この辺りはMOREコマンドと共通ですね。

FINDを使用する際、必要となるのは”検索文字列”です。文字列は必ず半角の””(ダブルクォート)でくくりましょう。また検索文字列には1byte文字はもちろん漢字やひらがななど2byte文字も使用可能です。

実際にFINDを使ってみましょう。今回は通常のDIRコマンドの出力と、パイプを使用して「DIRコマンドの出力を受けて、文字列を含む行を抽出して表示」させた出力を比較してみましょう。

まずはDIRコマンドのみ場合

> DIR
 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は C841-2070 です

 C:\Users\kobedenshi のディレクトリ

2020/07/25  14:02    <DIR>          .
2020/07/25  14:02    <DIR>          ..
2020/07/17  09:34    <DIR>          .vscode
2020/07/24  00:48    <DIR>          3D Objects
2020/07/24  00:48    <DIR>          Contacts
2020/08/03  00:46    <DIR>          Desktop
2020/07/16  23:56    <DIR>          Documents
2020/08/02  22:20    <DIR>          Downloads
2020/07/24  00:48    <DIR>          Favorites
2020/07/17  00:07    <DIR>          Intel
2020/07/24  00:48    <DIR>          Links
2020/07/24  00:48    <DIR>          Music
2020/08/03  15:28    <DIR>          OneDrive
2020/07/24  00:48    <DIR>          Saved Games
2020/07/24  00:48    <DIR>          Searches
2020/07/24  00:48    <DIR>          Videos
               0 個のファイル                   0 バイト
              16 個のディレクトリ  71,582,953,472 バイトの空き領域

となります。次に同じコマンド使用して、上記のデータをFINDに渡し、文字列”Documents”で抽出します。

> DIR | FIND "Documents"
2020/07/16  23:56    <DIR>          Documents

実行するとDocumentsの文字列を含む行のみ表示されました。

スイッチ一覧

オプションの種類機能
/v指定した文字列を含まない行をすべて表示する
/c指定した文字列を含む行の数だけを表示する
/n行番号を表示する
/i大文字と小文字の区別をしないで検索する

FINDには上記のようなスイッチがあり、必要に応じて文字列を含ませたり、除外したりできます。特に説明を必要とするスイッチもないように思います。

より高度で高速な検索機能が必要な方は「FINDSTR」コマンドをお勧めします。FINDSTRでは再帰的検索正規表現を使用した高度な文字列検索もできるようになっています。