Windowsコマンド入門

コマンド&スクリプト

Windowsコマンド入門記事です。
数ある入門サイトの中からこのブログに辿り着いたということは、Windowsコマンドを応用して圧倒的な生産性を手に入れたいと、Windowsコマンド連携の記事を探し回っているのではないでしょうか。
しかし少し待ってください。コマンドの連携の前にもう一度基礎を確認してみましょう。コマンド単体だけでも十分いろんなことができるのがWindowsコマンドです。

本記事は過去記事のまとめ記事になります。まだまだ更新していきますが、Windowsコマンドのおさらいがてら読んでいただけたら幸いです。
もちろん入門者が読めるようにまだまだ加筆するつもりです。

Contents

スポンサーリンク

Windowsコマンド 入門編

cmd.exeを起動


この画面はコマンド操作を行う作業場、コマンドプロンプトです。ユーザーはコンピュータにこの画面から、コマンドで命令を与え、実行結果を得ることができます。

コマンドプロンプトを起動するには、Windowsキー + Rキーで、「cmd」と入力してEnterキーを押すだけです。

cmdを実行すると、コマンドプロンプトが起動します。

コマンドプロンプトではプロパティを確認することができます。
タイトルバーを右クリックすると、プロパティのメニューがあるのでそれをクリック。

プロパティでは、コマンドプロンプトを自分好みでフォントや文字色、背景色等変更できます。

WindowsコマンドのHello World

プログラミング言語を学ぶときは、Hello World! から学ぶっていうのが常識的なんでしょうけど、Windowsコマンドがその常識に当てはまるとは思いません。別にHello World!が表示できたところで、Windowsコマンドを学ぶための足がかりにならないからです。

でも特に思いつかないのでコマンドラインのHello World!に相当するechoコマンドを使ってみます。echoは、引数で指定した文字列を表示するだけのコマンドです。Hello World!とはまではいかないので、表示するメッセージはHELLOぐらいにしておきます。

echoにスペースを一つ開けて、HELLOと入力し、Enterキーを押すと、

HELLOと表示されました。
それがどうしたってなりまよね。この時点ではWindowsコマンドを学ぶ意味が全く分からないと思います。

Windowsコマンドが使えると何がお得なの?

なぜWindowsコマンドを使う必要があるのか。
先ほどechoを実行してみました。HELLOが表示されただけで、特に面白いことが何もなく、ふーん程度の感想かと思います。echoコマンドを単体で使っただけでは、何かメリットがあるように感じられません。

結論からいうとWindowsコマンドを学ぶメリットは、スバリ、作業の効率化にあります。単純作業の自動化とか、大量処理を一括でやってしまうとか。
Windowsコマンドを学習して身につける前と後では、その生産性に天と地の差がつきます。ここでは大量処理を行うさわりの部分ついて、学習していきます。

ことはじめに一つ癖を付けておきましょう。

普段からコマンドプロンプトの真っ黒い画面を見慣れている上級者でも、画面に表示される内容が多いと混乱します。
普段から見慣れていない初心者となると、画面内の情報量に圧倒されて、今何をやってるのかさえ分からなくなります。こうなると学習どころじゃありません。

混乱を回避するため、画面をきれいにする癖をつけておきましょう。clsコマンドで画面をクリアできます。

実行すると、

きれいになりました。clsコマンド自体も消えますね。

次は、タイトルバーでプロパティを表示して、出力結果をたくさん表示できるようにするため、ウィンドウズの高さを20ぐらいにしておきましょう。まあこの辺りは好みですが。

さて、繰り返し処理をしてみます。echoコマンドを5回実行してみます。
ちょっと入力が難しいです。(doの前の;は不要です)

入力してEnterを押すと、以下のようにechoが5回繰り返しされます。

まだ、だから何? でしょうね。繰り返し処理ができることは分かりました。
(doの前の;は不要です)
ここで解説です。
%iってのは変数で、(1,1,5)は、1から5までの数字を1ずつカウントするって意味です。
%iは最初は1が格納され、echo 1が実行されます。
次に%iの値は+1されて、2になり、echo 2が実行されます。
これを5になるまで繰り返します。

doコマンドは、forコマンドで実行するコマンドを指定するのに使います。
ここでは、echoコマンドを実行しています。

次は、cdコマンドで、Desktopへ移動して、同じくechoコマンドを5回繰り返します。ただし今度は、「test_数字.txt」というファイルに出力結果を書き込んでみます。

入力して、Enterを押すと、あら不思議、デスクトップ上に、test_1〜test_5というファイルが出現しました。

次は、出現させたファイルを削除してみます。

del *.txtと入力し、Enterキー。


デスクトップ上のtxtファイルが全部消えました。
Windowsコマンドを使う優位性が少しわかってもらえたかと思います。ん? まだよくわからないですか。

もう少しファイルを増やしてみましょう。ファイル100個にしてみます。

入力してEnterすると、

ファイル多すぎですね。では、消してみます。

一瞬で消えました。ファイルが増えただけでさっきと同じ?
いやいや想像してみてください。Windowsコマンドを使わずに全ファイルを消そうと思ったら、ファイルをマウスで選択して、Delキーを押す、っていう一手間が必要になりますね。この一手間って、実は一手間ではなくて、ファイルが大量にあると、一回のファイル選択→Delキーという手順ではできないんです。何回か同じ手順を繰り返すことになります。これが、Windowsコマンドを使えば、一行のコマンド入力だけで済むんです。

cd ディレクトリ変更

cdはカレントディレクトリを変更する単純なコマンドです。
使ってみます。

C:\Users\taku>cd Desktop

C:\Users\taku\Desktop>

カレントディレクトリが「C:\Users\taku」から、「C:\Users\taku\Desktop」に変更されました。

一つ上の階層に変更するには、「..」を引数に与えます。

C:\Users\taku\Desktop>cd ..

C:\Users\taku>cd Desktop

一番上のパスへ変更する場合は、「¥」だけを指定します。

C:\Users\taku\Desktop>cd \

C:\>chdir Users\task\Desktop

引数なしで単にcdだけ実行すると、カレントディレクトリが表示されます。

C:\Users\taku\Desktop>cd
C:\Users\taku\Desktop

間違ったパスを指定すると、メッセージが表示され、カレントディレクトリは変更されません。

C:\>chdir Users\task\Desktop
指定されたパスが見つかりません。

C:\>

mkdir/md ディレクトリ作成

Windowsのディレクトリ作成コマンドは優れもので、オプションを付けずに多階層のディレクトリを作ることができます。

C:\Users\taku\Desktop>md aa\bb\cc

C:\Users\taku\Desktop>

treeコマンドで、作成されたディレクトリを確認してみましょう。

C:\Users\taku\Desktop>tree
フォルダー パスの一覧
ボリューム シリアル番号は C4E9-35F2 です
C:.
└─aa
    └─bb
        └─cc

C:\Users\taku\Desktop>

引数に複数のディレクトリ名を与えると、ディレクリが複数作成されます。

C:\Users\taku\Desktop>md 11 22 33

C:\Users\taku\Desktop>tree
フォルダー パスの一覧
ボリューム シリアル番号は C4E9-35F2 です
C:.
├─11
├─22
├─33
└─aa
    └─bb
        └─cc

C:\Users\taku\Desktop>

あらたに3つのディレクトリ(11 22 33)が増えました。

del/erase ファイル削除

delコマンドでファイルを削除できます。
このようなフォルダ構成のとき、

C:\Users\taku\Desktop>tree /f
フォルダー パスの一覧
ボリューム シリアル番号は C4E9-35F2 です
C:.
└─aa
    └─bb
        │  test1.txt
        │  test2.txt
        │
        └─cc
                test1.txt
                test3.txt


C:\Users\taku\Desktop>

/sオプションで指定した名前のファイルすべてを削除することができます。

C:\Users\taku\Desktop>del /s test1.txt
削除したファイル - C:\Users\taku\Desktop\aa\bb\test1.txt
削除したファイル - C:\Users\taku\Desktop\aa\bb\cc\test1.txt

C:\Users\taku\Desktop>tree /f
フォルダー パスの一覧
ボリューム シリアル番号は C4E9-35F2 です
C:.
└─aa
    └─bb
        │  test2.txt
        │
        └─cc
                test3.txt


C:\Users\taku\Desktop>

正しいパスを指定しないとファイルは削除されません。

C:\Users\taku\Desktop>del test2.txt
C:\Users\taku\Desktop\test2.txt が見つかりませんでした。

C:\Users\taku\Desktop>del *
C:\Users\taku\Desktop\*、よろしいですか (Y/N)? y

C:\Users\taku\Desktop>tree /f
フォルダー パスの一覧
ボリューム シリアル番号は C4E9-35F2 です
C:.
└─aa
    └─bb
        │  test2.txt
        │
        └─cc
                test3.txt


C:\Users\taku\Desktop>

正しいパスのときは削除されます。

C:\Users\taku\Desktop>del aa\bb\test2.txt

C:\Users\taku\Desktop>tree /f
フォルダー パスの一覧
ボリューム シリアル番号は C4E9-35F2 です
C:.
└─aa
    └─bb
        └─cc
                test3.txt


C:\Users\taku\Desktop>

フォルダを削除せず、ファイルだけを削除する

/sオプションとトップのフォルダ名を指定すると、サブディレクトリ内のファイル削除を順番に聞いてくれます。

C:\Users\taku\Desktop>del /s aa
C:\Users\taku\Desktop\aa\*、よろしいですか (Y/N)? y
C:\Users\taku\Desktop\aa\bb\*、よろしいですか (Y/N)? y
C:\Users\taku\Desktop\aa\bb\cc\*、よろしいですか (Y/N)? y
削除したファイル - C:\Users\taku\Desktop\aa\bb\cc\test3.txt

C:\Users\taku\Desktop>tree /f
フォルダー パスの一覧
ボリューム シリアル番号は C4E9-35F2 です
C:.
└─aa
    └─bb
        └─cc

C:\Users\taku\Desktop>

確認メッセージを表示しない

/qオプションを使えば、確認メッセージを表示することなくファイル削除ができます。

C:\Users\taku\Desktop>tree /f
フォルダー パスの一覧
ボリューム シリアル番号は C4E9-35F2 です
C:.
└─aa
    └─bb
        │  test1.txt
        │  test2.txt
        │
        └─cc
                test1.txt
                test3.txt


C:\Users\taku\Desktop>del /s /q aa
削除したファイル - C:\Users\taku\Desktop\aa\bb\test1.txt
削除したファイル - C:\Users\taku\Desktop\aa\bb\test2.txt
削除したファイル - C:\Users\taku\Desktop\aa\bb\cc\test1.txt
削除したファイル - C:\Users\taku\Desktop\aa\bb\cc\test3.txt

C:\Users\taku\Desktop>
C:\Users\taku\Desktop>tree /f
フォルダー パスの一覧
ボリューム シリアル番号は C4E9-35F2 です
C:.
└─aa
    └─bb
        └─cc

C:\Users\taku\Desktop>

rmdir/rd フォルダやファイル削除

フォルダもファイルも一度に削除してくれるコマンドです。さきほど作ったディレクトリを削除してみます。
何も考えずにrdしてみます。

C:\Users\taku\Desktop>rd aa
ディレクトリが空ではありません。

C:\Users\taku\Desktop>

空ディレクトリでない場合は、オプションを指定しないと削除できません。

/sを使うとサブディレクトリを含んで削除してくれます。

C:\Users\taku\Desktop>rd /s aa
aa、よろしいですか (Y/N)? n

C:\Users\taku\Desktop>

今回はNoにしました。

/qも指定すると、確認メッセージを表示せずに削除できます。
では、一気に削除してみます。

C:\Users\taku\Desktop>rd /s /q aa 11 22 33

C:\Users\taku\Desktop>

おさらいで各オプションのヘルプをみてみましょう。

C:\Users\taku\Desktop>rmdir /?
ディレクトリを削除します。

RMDIR [/S] [/Q] [ドライブ:]パス
RD [/S] [/Q] [ドライブ:]パス

    /S      指定されたディレクトリに加えて、そのディレクトリ内 のすべての
            ディレクトリとファイルを削除します。ディレクトリ ツリーを削除
            するときに使用します。

    /Q      /S を指定してディレクトリ ツリーを削除するときに、 確認の
            メッセージを表示しません。(QUIET モード)

copy ファイルのコピー

別ファイル名でコピー

C:\Users\taku\Desktop>echo AAAA>file1.txt

C:\Users\taku\Desktop>copy file1.txt file2.txt
        1 個のファイルをコピーしました。

C:\Users\taku\Desktop>type file2.txt
AAAA

C:\Users\taku\Desktop>

ディレクトリへコピー

C:\Users\taku\Desktop>del file2.txt

C:\Users\taku\Desktop>mkdir aa

C:\Users\taku\Desktop>copy file1.txt aa\
        1 個のファイルをコピーしました。

C:\Users\taku\Desktop>type aa\file1.txt
AAAA

C:\Users\taku\Desktop>

ファイルを連結

Windowsのcopyコマンドは、Linux(Unix)のcatコマンドのようにファイル連結ができます。
連結したいファイルを + 記号でつなげて、最後に結合先のファイルを指定すればよいです。

C:\Users\taku\Desktop>echo BBBB>file2.txt

C:\Users\taku\Desktop>copy file1.txt + file2.txt result.txt
file1.txt
file2.txt
        1 個のファイルをコピーしました。

C:\Users\taku\Desktop>type result.txt
AAAA
BBBB

C:\Users\taku\Desktop>

dir ファイル一覧

Windowsコマンドの優位性を感じてきたところで、使用頻度の高いコマンド、dirを使ってみたいと思います。

C:¥Users¥taku¥Desktop>for /L %i in (1,1,5) do echo %i > test_%i.txt

上記コマンドを実行した後の状態で、cls、dirを入力。

Enterを押すと、
デスクトップ上のファイルが一覧になって表示されました。

日付と、4という数字と、ファイル名が表示されています。
4という数字は、このファイルに書き込まれているバイト数です。
メモ帳でtest_1.txtを開いて内容をみてみます。

1と書かれてるだけです。なぜ4バイト?
実は1という文字の後に、空白が1文字入っており、その後に改行(CRLF)が2バイト分格納されています。トータル4バイトです。
ファイル5個の作成に使用したコマンドは、以下のようにforとechoの組み合わせでしたが、

C:¥Users¥taku¥Desktop>for /L %i in (1,1,5) do echo %i > test_%i.txt

echoを実行するときの、>(リダイレクト)の前に空白が入っているため、1の後に空白も混入していました。
空白を入れないようにechoを実行するように変更して、再度実行してみます。

C:¥Users¥taku¥Desktop>for /L %i in (1,1,5) do echo %i> test_%i.txt

ここでもう一度dirコマンド

今度はすべて3バイトですね。

さきほどメモ帳でtest_1.txtの内容を見ましたが、typeを使えば、コンソール上でファイルの内容を見ることができます。

全ファイルを一括で表示することもできます。

/s フォルダを再起的に取得

サブディレクトリの一覧も表示したいときは、/sオプションを使います。

C:\Users\taku\Desktop>md a\b

C:\Users\taku\Desktop>dir /s
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C4E9-35F2 です

 C:\Users\taku\Desktop のディレクトリ

2020/03/30  22:48    <DIR>          .
2020/03/30  22:48    <DIR>          ..
2020/03/30  22:48    <DIR>          a
               0 個のファイル                   0 バイト

 C:\Users\taku\Desktop\a のディレクトリ

2020/03/30  22:48    <DIR>          .
2020/03/30  22:48    <DIR>          ..
2020/03/30  22:48    <DIR>          b
               0 個のファイル                   0 バイト

 C:\Users\taku\Desktop\a\b のディレクトリ

2020/03/30  22:48    <DIR>          .
2020/03/30  22:48    <DIR>          ..
               0 個のファイル                   0 バイト

     ファイルの総数:
               0 個のファイル                   0 バイト
               8 個のディレクトリ  21,676,040,192 バイトの空き 領域

C:\Users\taku\Desktop>

/b 名前だけ取得

パスだけ表示したいときは、/bを併用します。

C:\Users\taku\Desktop>dir /b/s
C:\Users\taku\Desktop\a
C:\Users\taku\Desktop\a\b

C:\Users\taku\Desktop>

/w ワイド一覧

ワイド一覧形式で表示するには、/wを指定します。

C:\Users\taku\Desktop>dir /w
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C4E9-35F2 です

 C:\Users\taku\Desktop のディレクトリ

[.]           [..]          test_1.txt    test_10.txt
test_2.txt    test_3.txt    test_4.txt    test_5.txt
test_6.txt    test_7.txt    test_8.txt    test_9.txt
              10 個のファイル                  31 バイト
               2 個のディレクトリ  21,730,418,688 バイトの空き 領域

C:\Users\taku\Desktop>

/q ファイルの所有者

ファイルの所有者を表示するには、/qオプションを付けます。

C:\Users\taku\Desktop>dir /q
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C4E9-35F2 です

 C:\Users\taku\Desktop のディレクトリ

2020/04/01  21:41    <DIR>          DESKTOP-GQ56KQL\taku   .
2020/04/01  21:41    <DIR>          BUILTIN\Administrators ..
2020/04/01  21:41                 3 DESKTOP-GQ56KQL\taku   test_1.txt
2020/04/01  21:41                 3 DESKTOP-GQ56KQL\taku   test_2.txt
2020/04/01  21:41                 3 DESKTOP-GQ56KQL\taku   test_3.txt
               3 個のファイル                   9 バイト
               2 個のディレクトリ  21,728,403,456 バイトの空き 領域

C:\Users\taku\Desktop>

for 繰り返し

for 列挙した文字列で繰り返す

forコマンドを使ってみます。1 2 3をechoで表示するには、()で囲んで変数に順に格納してechoの引数に与えます。

C:\Users\taku\Desktop>for %i in (1 2 3) do echo %i

C:\Users\taku\Desktop>echo 1
1

C:\Users\taku\Desktop>echo 2
2

C:\Users\taku\Desktop>echo 3
3

C:\Users\taku\Desktop>

echo自体を表示したくないときは、@echoを使います。

C:\Users\taku\Desktop>for %i in (1 2 3) do @echo %i
1
2
3

C:\Users\taku\Desktop>

数字以外でも文字列を()内に空白で区切って並べれば、変数に格納されます。

C:\Users\taku\Desktop>for %i in (test1 test2 test3) do @echo %i
test1
test2
test3

C:\Users\taku\Desktop>

一括でファイルを作成してみます。

C:\Users\taku\Desktop>for %i in (1 2 3) do @echo %i>test_%i.txt

C:\Users\taku\Desktop>dir /b
test_1.txt
test_2.txt
test_3.txt

C:\Users\taku\Desktop>

for /L 数列で繰り返す

/Lオプションを使うと、()内に数列生成式を記述すれば、数列での繰り返し処理ができます。
書式は(開始値,ステップ値,最終値)です。

C:\Users\taku\Desktop>for /l %i in (1,1,5) do @echo %i
1
2
3
4
5

C:\Users\taku\Desktop>

/Lオプションを指定しないとこうなります。

C:\Users\taku\Desktop>for %i in (1,1,5) do @echo %i
1
1
5

C:\Users\taku\Desktop>

for /R ディレクトリツリーを巡回して繰り返し

まず巡回するディレクトリから作成します。

C:\Users\taku\Desktop>mkdir aa\bb

C:\Users\taku\Desktop>mkdir cc\dd\ee

C:\Users\taku\Desktop>mkdir ff

C:\Users\taku\Desktop>

forコマンドに、/Rオプションを指定します。

C:\Users\taku\Desktop>for /r %i in (test.txt) do @echo HELLO>%i

C:\Users\taku\Desktop>

何も表示されませんでしたが、何か実行されたはずです。
treeコマンドでカレントディレクトリ配下全階層確認してみましょう。

C:\Users\taku\Desktop>tree /f
フォルダー パスの一覧
ボリューム シリアル番号は C4E9-35F2 です
C:.
│  test.txt
│
├─aa
│  │  test.txt
│  │
│  └─bb
│          test.txt
│
├─cc
│  │  test.txt
│  │
│  └─dd
│      │  test.txt
│      │
│      └─ee
│              test.txt
│
└─ff
        test.txt


C:\Users\taku\Desktop>

すべての階層にtest.txtファイルが作成されました。

for /F コマンド実行結果で繰り返し

dir結果がこのような場合、

C:\Users\taku\Desktop>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C4E9-35F2 です

 C:\Users\taku\Desktop のディレクトリ

2020/05/13  20:31    <DIR>          .
2020/05/13  20:31    <DIR>          ..
2020/05/13  20:57                98 file1.txt
2020/05/13  20:32                68 file2.txt
               2 個のファイル                 166 バイト
               2 個のディレクトリ  13,434,576,896 バイトの空き 領域

C:\Users\taku\Desktop>

/Fオプション”usebackq”を指定して、コマンド実行結果で繰り返しができます。

C:\Users\taku\Desktop>for /f "usebackq" %I in (`dir /b`) do @echo %~fI
C:\Users\taku\Desktop\file1.txt
C:\Users\taku\Desktop\file2.txt

C:\Users\taku\Desktop>for /f "usebackq" %I in (`dir /b`) do @echo %~dI
C:
C:

C:\Users\taku\Desktop>for /f "usebackq" %I in (`dir /b`) do @echo %~pI
\Users\taku\Desktop\
\Users\taku\Desktop\

C:\Users\taku\Desktop>for /f "usebackq" %I in (`dir /b`) do @echo %~nI
file1
file2

C:\Users\taku\Desktop>for /f "usebackq" %I in (`dir /b`) do @echo %~xI
.txt
.txt

C:\Users\taku\Desktop>for /f "usebackq" %I in (`dir /b`) do @echo %~sI
C:\Users\taku\Desktop\file1.txt
C:\Users\taku\Desktop\file2.txt

C:\Users\taku\Desktop>for /f "usebackq" %I in (`dir /b`) do @echo %~aI
--a--------
--a--------

C:\Users\taku\Desktop>for /f "usebackq" %I in (`dir /b`) do @echo %~tI
2020/05/13 20:57
2020/05/13 20:32

C:\Users\taku\Desktop>for /f "usebackq" %I in (`dir /b`) do @echo %~zI
98
68

C:\Users\taku\Desktop>

findstr 検索

findstrは、文字列を検索するコマンドです。
学習の前に、検索対象の文字列を作ってファイルに用意しておきます。1から1000までの数字が入ったファイルにしました。

C:\Users\taku\Desktop>for /L %i in (1,1,1000) do @echo %i>> test.txt

C:\Users\taku\Desktop>

作成したファイルをdirで確認。

C:\Users\taku\Desktop>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C4E9-35F2 です

 C:\Users\taku\Desktop のディレクトリ

2020/04/02  21:30    <DIR>          .
2020/04/02  21:30    <DIR>          ..
2020/04/02  21:30             4,893 test.txt
               1 個のファイル               4,893 バイト
               2 個のディレクトリ  20,587,012,096 バイトの空き 領域

C:\Users\taku\Desktop>

それなりのファイルサイズがありますね。

では、findstrで文字列の検索をしてみましょう。
文字列「333」を検索してみます。

C:\Users\taku\Desktop>findstr 333 test.txt
333

C:\Users\taku\Desktop>

見つかりました。

/Nオプションは、見つかった行の行番号を表示するオプションです。
さきほどのコマンドの前に/Nを指定すると、

C:\Users\taku\Desktop>findstr /n 333 test.txt
333:333

C:\Users\taku\Desktop>

行番号も表示されました。
:(コロン)の前が行番号で、:の後がテキストファイルの内容です。

findstrは正規表現が使えます。

155 255 355を検索してみましょう。
‘[123]55’もしくは、'[1-3]55’と指定すればよいです。

C:\Users\taku\Desktop>findstr /n [123]55 test.txt
155:155
255:255
355:355

C:\Users\taku\Desktop>

コマンドの結果から特定文字列を抽出する

ファイル内の文字列だけでなく、コマンドの結果からfindstrで特定の文字列を検索することができます。
dirの結果をフィルタリングしてみましょう。

C:\Users\taku\Desktop>dir | findstr test.txt
2020/04/02  21:30             4,893 test.txt

C:\Users\taku\Desktop>

プロセス一覧から特定のプロセスを抽出

他のコマンドの結果でも試してみたいと思います。tasklistはプロセス一覧表示するコマンドです。この中から特定のプロセスを抽出してみましょう。

C:\Users\taku\Desktop>tasklist | findstr cmd.exe
cmd.exe                       7920 Console                   12      4,396 K

C:\Users\taku\Desktop>

type 内容表示

ファイルの内容をタイプ(表示)してくれるコマンドです。
使ってみます。

C:\Users\taku\Desktop>echo HELLO>test.txt

C:\Users\taku\Desktop>type test.txt
HELLO

C:\Users\taku\Desktop>

Linux/Unixコマンドのcatに似ていますが、残念ながら連結も行番号表示もできません。
引数に複数ファイルを指定すると、このような表示になります。

C:\Users\taku\Desktop>type test.txt test.txt

test.txt


HELLO

test.txt


HELLO

C:\Users\taku\Desktop>

prompt プロンプト変更

promptコマンドでプロンプトを変更できます。プロンプトとは何? という説明は、このコマンドを使ってみた方が早いです。
引数に適当な文字列を与えてみます。

C:\Users\taku\Desktop>prompt "<TEST>"

"<TEST>"
"<TEST>"

今までカレントディレクトリを表示していたところが、”<TEST>”に変わりました。これこそが(コマンド)プロンプトといいます。

一般にコマンドプロンプトといえば、コマンド入力のための真っ黒なウィンドウ(cmd.exe)のことを表します。
元々は、コマンド入力を促すためのプロンプトが由来です。(英語 prompt 促す)

ターミナルウィンドウ自体をコマンドプロンプトと名付けてしまったMicrosoftのセンスを疑ってしまいますが、コマンドプロンプトを表示する意味で名付けているとしたら、あながち間違いではないのかなと思います。

その他の表示も試してみましょう。”>”記号を使うには、$gという特殊コードを用います。

"<TEST>"prompt TEST$g

TEST>
TEST>
TEST>

デフォルトのプロンプトは$p$gです。

TEST>prompt $p$g

C:\Users\taku\Desktop>
C:\Users\taku\Desktop>

特殊コードの説明です。
$p カレントドライブとディレクトリのパス
$n カレントドライブ
$d 現在日付
$t 現在時刻
$v Windowsバージョン

各記号はコマンド入力で特殊な使い方をするものが多いため注意が必要です。
「割り当てなし」の記号はそのまま記号が使えます。
! 割り当てなし
” 割り当てなし
# 割り当てなし
$ $$
% 割り当てなし
& $a
‘ 割り当てなし
( $c ( “(“も使える )
) $f ( “)”も使える )
= $q ( “=”も使える、ただし単体では使えない )
~ 割り当てなし
| $b
< $l
> $g
? 割り当てなし
空白 $s
改行 $_
ESC $e

title ウィンドウのタイトルを設定

コマンドプロンプトのウィンドウを複数開いていると、どこのウィンドウで何の作業をしているかわからなくなるときがあります。
そんなときに、コマンドプロンプトのタイトル名で区別できるようになると、他の作業の割り込みで作業していたコマンドプロンプトのウィンドウを忘れてしまっても、スムーズに意図するコマンドプロンプトへ復帰できるため作業が捗ります。

C:\Users\takk> title WINDOW_A

forfiles フォルダ一覧

Windowsコマンドプロンプトでのforfilesコマンドを使います。

forfilesは、指定したパスの各ファイルをパラメータとして指定コマンドを実行するコマンドです。まあUnix/Linuxのfindと同じようなことがやれます。
※Windowsにもfindという名前のコマンドがありますが、こちらは別の意味(テキスト検索)のコマンドです。

では使ってみましょう。現在のディレクトリ構成はこのようになっています。

C:\Users\takk\aaa> tree
フォルダー パスの一覧
ボリューム シリアル番号は 0000000C C288:F709 です
C:.
├─145
│  └─622
│      └─134
│          └─0
├─180
│  └─229
│      └─579
│          └─7
├─209
│  └─890
│      └─176
│          └─6
├─267
│  └─683
│      └─995
└─905
    └─744
        └─892

では、forfilesを パラメータなしで実行。

C:\Users\takk\aaa> forfiles

"145"
"180"
"209"
"267"
"905"
C:\Users\takk\aaa>

サブディレクトリを再帰的に処理するには、/sオプションをつけます。

PS C:\Users\takk\aaa> forfiles /s

"145"
"180"
"209"
"267"
"905"
"622"
"134"
"0"
"file.txt"
"229"
"579"
"7"
"file.txt"
"890"
"176"
"6"
"file.txt"
"683"
"995"
"file.txt"
"744"
"892"
"file.txt"
C:\Users\takk\aaa>

ファイル名だけでは分かり難いですね。フルパスの一覧にしてみましょう。

C:\Users\takk\aaa> forfiles /s /c "cmd /c echo @path"

"C:\Users\takk\aaa\145"
"C:\Users\takk\aaa\180"
"C:\Users\takk\aaa\209"
"C:\Users\takk\aaa\267"
"C:\Users\takk\aaa\905"
"C:\Users\takk\aaa\145\622"
"C:\Users\takk\aaa\145\622\134"
"C:\Users\takk\aaa\145\622\134\0"
"C:\Users\takk\aaa\145\622\134\0\file.txt"
"C:\Users\takk\aaa\180\229"
"C:\Users\takk\aaa\180\229\579"
"C:\Users\takk\aaa\180\229\579\7"
"C:\Users\takk\aaa\180\229\579\7\file.txt"
"C:\Users\takk\aaa\209\890"
"C:\Users\takk\aaa\209\890\176"
"C:\Users\takk\aaa\209\890\176\6"
"C:\Users\takk\aaa\209\890\176\6\file.txt"
"C:\Users\takk\aaa\267\683"
"C:\Users\takk\aaa\267\683\995"
"C:\Users\takk\aaa\267\683\995\file.txt"
"C:\Users\takk\aaa\905\744"
"C:\Users\takk\aaa\905\744\892"
"C:\Users\takk\aaa\905\744\892\file.txt"
C:\Users\takk\aaa>

面倒なのですが、echoコマンドは、cmdの内部コマンドなので、cmd /c echoで実行しなければなりません。

ファイルのみを一覧する場合。

C:\Users\takk\aaa>forfiles /s /c "cmd /c if @isdir==FALSE echo @path"

"C:\Users\takk\aaa\145\622\134\0\file.txt"
"C:\Users\takk\aaa\180\229\579\7\file.txt"
"C:\Users\takk\aaa\209\890\176\6\file.txt"
"C:\Users\takk\aaa\267\683\995\file.txt"
"C:\Users\takk\aaa\905\744\892\file.txt"

C:\Users\takk\aaa>

xcopy フォルダコピー

最初にコピー元用のフォルダを作ります。

C:\Users\takk\aaa>mkdir dir1

C:\Users\takk\aaa>cd dir1

C:\Users\takk\aaa\dir1>

さらに適当にフォルダ階層を作ります。

C:\Users\takk\aaa\dir1> powershell -c "1..5 | %{$r=get-random; $dir=$r -replace('(...)','$&\\');mkdir $dir | out-null}"

C:\Users\takk\aaa\dir1>

どのようなフォルダ階層となったか確認してみます。

C:\Users\takk\aaa\dir1>tree
フォルダー パスの一覧
ボリューム シリアル番号は 00000019 C288:F709 です
C:.
├─143
│  └─224
│      └─609
│          └─9
├─570
│  └─020
│      └─459
├─627
│  └─820
│      └─947
├─712
│  └─969
│      └─793
└─833
    └─371
        └─285

C:\Users\takk\aaa\dir1>

では、一つ上のディレクトリに戻り、dir1をコピーしてみましょう。

C:\Users\takk\aaa\dir1> cd ..

C:\Users\takk\aaa>

copyコマンドを使うとこのようになります。

C:\Users\takk\aaa>copy dir1 dir2
dir1\*
指定されたファイルが見つかりません。
        0 個のファイルをコピーしました。

C:\Users\takk\aaa>

xcopyを使います。

C:\Users\takk\aaa>xcopy /e dir1 dir2
dir2 は受け側のファイル名ですか、
またはディレクトリ名ですか
(F= ファイル、D= ディレクトリ)? d
0 個のファイルをコピーしました

C:\Users\takk\aaa>

0 個のファイルをコピーしました、と表示されて失敗のように見えますが、
フォルダ(ディレクトリ)はコピーされています。
treeで確認してみましょう。

C:\Users\takk\aaa>tree dir2
フォルダー パスの一覧
ボリューム シリアル番号は 00000067 C288:F709 です
C:\USERS\TAKK\AAA\DIR2
├─143
│  └─224
│      └─609
│          └─9
├─570
│  └─020
│      └─459
├─627
│  └─820
│      └─947
├─712
│  └─969
│      └─793
└─833
    └─371
        └─285

C:\Users\takk\aaa>

フォルダ構成のみコピー

xcopyの/tオプションでフォルダ構成(フォルタツリー)のみコピーできます。
例によって適当にフォルダとファイルを作成します。

C:\Users\takk\aaa> powershell -c "1..5 | %{$r=get-random; $dir=$r -replace('(...)','$&\\');mkdir dir1/$dir | out-null;echo HELLO > dir1/$dir/file.txt}"

このようなフォルダとファイルになりました。

C:\Users\takk\aaa>dir /b/s
C:\Users\takk\aaa\dir1
C:\Users\takk\aaa\dir1\142
C:\Users\takk\aaa\dir1\175
C:\Users\takk\aaa\dir1\482
C:\Users\takk\aaa\dir1\901
C:\Users\takk\aaa\dir1\966
C:\Users\takk\aaa\dir1\142\849
C:\Users\takk\aaa\dir1\142\849\345
C:\Users\takk\aaa\dir1\142\849\345\5
C:\Users\takk\aaa\dir1\142\849\345\5\file.txt
C:\Users\takk\aaa\dir1\175\882
C:\Users\takk\aaa\dir1\175\882\191
C:\Users\takk\aaa\dir1\175\882\191\1
C:\Users\takk\aaa\dir1\175\882\191\1\file.txt
C:\Users\takk\aaa\dir1\482\614
C:\Users\takk\aaa\dir1\482\614\778
C:\Users\takk\aaa\dir1\482\614\778\file.txt
C:\Users\takk\aaa\dir1\901\626
C:\Users\takk\aaa\dir1\901\626\234
C:\Users\takk\aaa\dir1\901\626\234\file.txt
C:\Users\takk\aaa\dir1\966\459
C:\Users\takk\aaa\dir1\966\459\308
C:\Users\takk\aaa\dir1\966\459\308\file.txt

C:\Users\takk\aaa>

ではdir1をコピーしてdir2を作ります。ただし、フォルダツリーのみでファイルはコピーしません。

C:\Users\takk\aaa>xcopy /t dir1 dir2
dir2 は受け側のファイル名ですか、
またはディレクトリ名ですか
(F= ファイル、D= ディレクトリ)? d

C:\Users\takk\aaa>

/tオプションをつけることで、フォルダツリーのみコピーされました。

C:\Users\takk\aaa>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C288-F709 です

 C:\Users\takk\aaa のディレクトリ

2017/07/10  21:50    <DIR>          .
2017/07/10  21:50    <DIR>          ..
2017/07/10  21:27    <DIR>          dir1
2017/07/10  21:50    <DIR>          dir2
               0 個のファイル                   0 バイト
               4 個のディレクトリ  167,918,505,984 バイトの空き領域

C:\Users\takk\aaa>dir /b/s dir2
C:\Users\takk\aaa\dir2\142
C:\Users\takk\aaa\dir2\175
C:\Users\takk\aaa\dir2\482
C:\Users\takk\aaa\dir2\901
C:\Users\takk\aaa\dir2\966
C:\Users\takk\aaa\dir2\142\849
C:\Users\takk\aaa\dir2\142\849\345
C:\Users\takk\aaa\dir2\142\849\345\5
C:\Users\takk\aaa\dir2\175\882
C:\Users\takk\aaa\dir2\175\882\191
C:\Users\takk\aaa\dir2\175\882\191\1
C:\Users\takk\aaa\dir2\482\614
C:\Users\takk\aaa\dir2\482\614\778
C:\Users\takk\aaa\dir2\901\626
C:\Users\takk\aaa\dir2\901\626\234
C:\Users\takk\aaa\dir2\966\459
C:\Users\takk\aaa\dir2\966\459\308

C:\Users\takk\aaa>

次にこのdir2をコピーしてdir3を作成してみましょう。

C:\Users\takk\aaa>xcopy /t dir2 dir3
dir3 は受け側のファイル名ですか、
またはディレクトリ名ですか
(F= ファイル、D= ディレクトリ)? d

C:\Users\takk\aaa>

コピーできたか確認します。

C:\Users\takk\aaa>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C288-F709 です

 C:\Users\takk\aaa のディレクトリ

2017/07/10  21:50    <DIR>          .
2017/07/10  21:50    <DIR>          ..
2017/07/10  21:27    <DIR>          dir1
2017/07/10  21:50    <DIR>          dir2
               0 個のファイル                   0 バイト
               4 個のディレクトリ  167,918,374,912 バイトの空き領域

C:\Users\takk\aaa>

dir3が作られていません。xcopyの/tオプションは、ファイルが格納されていないフォルダは無視されるからです。
空フォルダの場合でもコピーする/eオプションと併用します。

C:\Users\takk\aaa>xcopy /t/e dir2 dir3
dir3 は受け側のファイル名ですか、
またはディレクトリ名ですか
(F= ファイル、D= ディレクトリ)? d

C:\Users\takk\aaa>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C288-F709 です

 C:\Users\takk\aaa のディレクトリ

2017/07/10  22:04    <DIR>          .
2017/07/10  22:04    <DIR>          ..
2017/07/10  21:27    <DIR>          dir1
2017/07/10  21:50    <DIR>          dir2
2017/07/10  22:04    <DIR>          dir3
               0 個のファイル                   0 バイト
               5 個のディレクトリ  167,918,379,008 バイトの空き領域

C:\Users\takk\aaa>

dir3のツリーを確認してみましょう。

C:\Users\takk\aaa>tree dir3
フォルダー パスの一覧
ボリューム シリアル番号は 00000014 C288:F709 です
C:\USERS\TAKK\AAA\DIR3
├─142
│  └─849
│      └─345
│          └─5
├─175
│  └─882
│      └─191
│          └─1
├─482
│  └─614
│      └─778
├─901
│  └─626
│      └─234
└─966
    └─459
        └─308

C:\Users\takk\aaa>

問題なくフォルダツリーができました。

makecab 必要ファイルだけ圧縮

今回はWindowsでの圧縮です。ストレージもオンライン上に無限にある今、データの圧縮なんていらないんじゃないかとも思えますが、ファイルをまとめることは、人間にとっても頭の整理になるので必要ですね。複雑な構造のディレクトリ内の特定ファイルだけを圧縮してcab形式で圧縮してみます。

先にPowerShellで実験用ファイルを作っておきます。

PS C:\Users\takk\aaa> mkdir dir1 | out-null
PS C:\Users\takk\aaa> cd dir1
PS C:\Users\takk\aaa\dir1> 1..10 | %{$r=random;$dir=$r -replace "(....)","$&\";mkdir $dir | out-null;$fname="file$_.txt"
;"HELLO" > $dir\$fname}
PS C:\Users\takk\aaa\dir1> gci -name -re -i *.txt
1295\1272\13\file6.txt
1598\7997\42\file3.txt
1689\0633\86\file4.txt
1955\2146\92\file7.txt
2310\6227\6\file1.txt
2602\6181\6\file5.txt
4748\0337\file10.txt
4829\4788\5\file9.txt
6104\6524\2\file8.txt
6827\0945\3\file2.txt
PS C:\Users\takk\aaa\dir1> cd
PS C:\Users\takk\aaa>

ここからは、コマンドプロンプト操作です。

圧縮したいファイルはfile1.txt file3.txt file5.txtとします。
これをコマンドプロンプトで抽出するには、

C:\Users\takk\aaa>dir /b/s | findstr file[135].txt
C:\Users\takk\aaa\dir1\1598\7997\42\file3.txt
C:\Users\takk\aaa\dir1\2310\6227\6\file1.txt
C:\Users\takk\aaa\dir1\2602\6181\6\file5.txt

C:\Users\takk\aaa>

抽出結果は、ファイルへ保存しておきます。

C:\Users\takk\aaa>dir /b/s | findstr file[135].txt > files

C:\Users\takk\aaa>

あとはmakecabすればよいです。

C:\Users\takk\aaa>makecab /f files
Cabinet Maker - Lossless Data Compression Tool

48 bytes in 3 files
Total files:              3
Bytes before:            48
Bytes after:             20
After/Before:            41.67% compression
Time:                     0.03 seconds ( 0 hr  0 min  0.03 sec)
Throughput:               1.51 Kb/second

C:\Users\takk\aaa>

圧縮されたファイルは、disk1\1.cabに保存されます。

C:\Users\takk\aaa>dir disk1
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C288-F709 です

 C:\Users\takk\aaa\disk1 のディレクトリ

2017/07/29  13:14    <DIR>          .
2017/07/29  13:14    <DIR>          ..
2017/07/29  13:14               150 1.cab
               1 個のファイル                 150 バイト
               2 個のディレクトリ  169,978,245,120 バイトの空き領域

C:\Users\takk\aaa>

robocopy コピーの中断再開

面倒な大量のファイルのコピーについて。バックアップとったりとか。古いストレージだからなのか私のPC環境では、ファイルコピー中に、よくPCがいかれてしまいます。
robocopyなら中断したファイルコピーの再開も簡単です。

では実験用の6000個のファイルを作ります。

PS C:\Users\takk\aaa> cd dir1
PS C:\Users\takk\aaa\dir1> 1..6000 | %{1..1000 >> file$_.txt}
PS C:\Users\takk\aaa\dir1> (gci -name).count
6000
PS C:\Users\takk\aaa\dir1> cd ..
PS C:\Users\takk\aaa>

ファイル数は以下のとおり6000です。

PS C:\Users\takk\aaa> (gci dir1).count
6000
PS C:\Users\takk\aaa>

ではdir1をコピーしてdir2を作成します。コピーを途中で中断させます。

PS C:\Users\takk\aaa> robocopy /ndl /nfl /z dir1 dir2

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------

  開始: 2017年8月1日 21:57:44
   コピー元 : C:\Users\takk\aaa\dir1\
     コピー先 : C:\Users\takk\aaa\dir2\

    ファイル: *.*

  オプション: *.* /NDL /NFL /DCOPY:DA /COPY:DAT /Z /R:1000000 /W:30

------------------------------------------------------------------------------
PS C:\Users\takk\aaa> (gci dir2 -name).count
2941
PS C:\Users\takk\aaa>

半分の3000弱で停止しました。

ではコピーの再開です。同じコマンド実行するだけです。

PS C:\Users\takk\aaa> robocopy /ndl /nfl /z dir1 dir2

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------

  開始: 2017年8月1日 21:59:04
   コピー元 : C:\Users\takk\aaa\dir1\
     コピー先 : C:\Users\takk\aaa\dir2\

    ファイル: *.*

  オプション: *.* /NDL /NFL /DCOPY:DA /COPY:DAT /Z /R:1000000 /W:30

------------------------------------------------------------------------------


------------------------------------------------------------------------------

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         1         0         0         0         0         0
     ファイル:      6000      3059      2941         0         0         0
      バイト:   56.00 m   28.55 m   27.45 m         0         0         0
       時刻:   0:00:15   0:00:15                       0:00:00   0:00:00


       速度:             1925621 バイト/秒
       速度:             110.184 MB/分
   終了: 2017年8月1日 21:59:20

PS C:\Users\takk\aaa>
6000
PS C:\Users\takk\aaa>

結果をみてみると、コピー済の2941ファイルがスキップされ、残りの3059ファイルだけコピーされたことがわかります。
dir1のファイルがすべて、dir2にコピーされました。

dir1とdir2の内容は一致するでしょうか。

PS C:\Users\takk\aaa> $dir1=gci dir1 -name | %{get-filehash dir1\$_}
PS C:\Users\takk\aaa> $dir2=gci dir1 -name | %{get-filehash dir2\$_}
PS C:\Users\takk\aaa> diff $dir1 $dir2
PS C:\Users\takk\aaa>

差分が表示されませんでした。一致したということです。

color コンソール色変更

色コマンドです。Windowsのコンソールの色をcolorコマンドで変更できます。コマンドプロンプトでもPowerShellのコンソールでも使えます。
まず、ヘルプから。カラーコード以外の適当な文字を引数に指定すると、ヘルプが表示されます。

C:\Users\takk>color .

このような説明が表示されます。何色が何番だったか忘れた時に見るぐらいです。

コンソールの既定の前景色および背景色を設定します。

COLOR [属性]

  属性        コンソール出力の色属性を指定します。

色属性は、2 桁の 16 進数で指定します。
1 桁目は背景に、2 桁目は前景に対応します。
各桁には、次のいずれかの値を指定すること
ができます:

    0 = 黒          8 = 灰色
    1 = 青          9 = 明るい青
    2 = 緑          A = 明るい緑
    3 = 水色        B = 明るい水色
    4 = 赤          C = 明るい赤
    5 = 紫          D = 明るい紫
    6 = 黄色        E = 明るい黄色
    7 = 白          F = 輝く白

引数を指定しないでこのコマンドを実行すると、CMD.EXE が起動されたときの
色を復元します。
この値は、現在のコンソール ウィンドウ、/T コマンド
ライン スイッチ、またはレジストリの DefaultColor 値から取得されます。

前景と背景に同じ色を指定して COLOR コマンドを実行しようとすると、
COLOR コマンドは、ERRORLEVEL を 1 に設定します。

例: "COLOR fc" は、輝く白の上に明るい赤を表示します。

使い方は、ヘルプの例にある通りです。
たくさん指定できて覚えにくいですが、カラーコードの0~7までを覚えて、プラス8したら明るい色になると覚えておけば良いです。

コマンドプロンプトを新規に起動して、異なる背景色に設定してみましょう。

C:\Users\takk>for /L %i in (1,1,7);do start color %i7

実行すると、

7つの色の異なるコンソールが起動します。 ※上の画像は手動で並べ替えをしています

whoami ユーザ名

takk@debian:~$ whoami
takk
takk@debian:~$

上の結果のようにLinuxのwhoamiは、ユーザ名が表示されるだけでしたが、Windowsのwhoamiには、いろいろオプションがあります。
/UPN
/FQDN
/USER
/GROUPS
/CLAIMS
/PRIV
/LOGONID
/ALL
/FO
/NH
/?
と、たくさんありますが、たまにしか使わない場合は、覚えるのは3パターンぐらいでよいかと思います。

まずは、引数なしパターン。

C:\Users\takk>whoami
takkpc\takk

C:\Users\takk>

次に、/ALLパターン。

C:\Users\takk>whoami /all

USER INFORMATION
----------------

ユーザー名  SID
=========== ==============================================
takkpc\takk .-.-.-..-..........-..........-..........-....


GROUP INFORMATION
-----------------

グループ名                                                           種類                 SID                                            属性
==================================================================== ==================== ============================================== ========================================
Everyone                                                             よく知られたグループ S-.-.-.                                        固定グループ, 既定で有効, 有効なグループ
NT AUTHORITY\ローカル アカウントと Administrators グループのメンバー よく知られたグループ S-.-.-...                                      拒否のみに使用するグループ
TAKKPC\HomeUsers                                                     エイリアス           S-.-.-..-..........-..........-..........-.... 固定グループ, 既定で有効, 有効なグループ
BUILTIN\Users                                                        エイリアス           S-.-.-..-...                                   固定グループ, 既定で有効, 有効なグループ
BUILTIN\Administrators                                               エイリアス           S-.-.-..-...                                   拒否のみに使用するグループ
NT AUTHORITY\INTERACTIVE                                             よく知られたグループ S-.-.-.                                        固定グループ, 既定で有効, 有効なグループ
CONSOLE LOGON                                                        よく知られたグループ S-.-.-.                                        固定グループ, 既定で有効, 有効なグループ
NT AUTHORITY\Authenticated Users                                     よく知られたグループ S-.-.-..                                       固定グループ, 既定で有効, 有効なグループ
NT AUTHORITY\This Organization                                       よく知られたグループ S-.-.-..                                       固定グループ, 既定で有効, 有効なグループ
NT AUTHORITY\ローカル アカウント                                     よく知られたグループ S-.-.-...                                      固定グループ, 既定で有効, 有効なグループ
LOCAL                                                                よく知られたグループ S-.-.-.                                        固定グループ, 既定で有効, 有効なグループ
NT AUTHORITY\NTLM Authentication                                     よく知られたグループ S-.-.-..-..                                    固定グループ, 既定で有効, 有効なグループ
Mandatory Label\Medium Mandatory Level                               ラベル               S-.-..-....


PRIVILEGES INFORMATION
----------------------

特権名                        説明                                            状態
============================= =============================================== ====
SeShutdownPrivilege           システムのシャットダウン                        無効
SeChangeNotifyPrivilege       走査チェックのバイパス                          有効
SeUndockPrivilege             ドッキング ステーションからコンピューターを削除 無効
SeIncreaseWorkingSetPrivilege プロセス ワーキング セットの増加                無効
SeTimeZonePrivilege           タイム ゾーンの変更                             無効

最後に /ALLの別フォーマットパターン。/foで指定します。

C:\Users\takk>whoami /all /fo csv
"ユーザー名","SID"
"takkpc\takk","S-.-.-..-..........-..........-..........-...."

"グループ名","種類","SID","属性"
"Everyone","よく知られたグループ","S-.-.-.","固定グループ, 既定で有効, 有効なグループ"
"NT AUTHORITY\ローカル アカウントと Administrators グループのメンバー","よく知られたグループ","S-.-.-...","拒否のみに使用するグループ"
"TAKKPC\HomeUsers","エイリアス","S-.-.-..-..........-..........-..........-....","固定グループ, 既定で有効, 有効なグループ"
"BUILTIN\Users","エイリアス","S-.-.-..-...","固定グループ, 既定で有効, 有効なグループ"
"BUILTIN\Administrators","エイリアス","S-.-.-..-...","拒否のみに使用するグループ"
"NT AUTHORITY\INTERACTIVE","よく知られたグループ","S-.-.-.","固定グループ, 既定で有効, 有効なグループ"
"CONSOLE LOGON","よく知られたグループ","S-.-.-.","固定グループ, 既定で有効, 有効なグループ"
"NT AUTHORITY\Authenticated Users","よく知られたグループ","S-.-.-..","固定グループ, 既定で有効, 有効なグループ"
"NT AUTHORITY\This Organization","よく知られたグループ","S-.-.-..","固定グループ, 既定で有効, 有効なグループ"
"NT AUTHORITY\ローカル アカウント","よく知られたグループ","S-.-.-...","固定グループ, 既定で有効, 有効なグループ"
"LOCAL","よく知られたグループ","S-.-.-.","固定グループ, 既定で有効, 有効なグループ"
"NT AUTHORITY\NTLM Authentication","よく知られたグループ","S-.-.-..-..","固定グループ, 既定で有効, 有効なグループ"
"Mandatory Label\Medium Mandatory Level","ラベル","S-.-..-....",""

"特権名","説明","状態"
"SeShutdownPrivilege","システムのシャットダウン","無効"
"SeChangeNotifyPrivilege","走査チェックのバイパス","有効"
"SeUndockPrivilege","ドッキング ステーションからコンピューターを削除","無効"
"SeIncreaseWorkingSetPrivilege","プロセス ワーキング セットの増加","無効"
"SeTimeZonePrivilege","タイム ゾーンの変更","無効"


date 日付取得

Linuxの場合は、dateと入力するだけで、今日の日付も、今の時刻も表示されます。

takk@debian:~$ date
2017年  8月 10日 木曜日 22:03:32 JST

Windowsは、dateコマンドで今日の日付は表示されますが、新しい日付まで要求されます。

C:\Users\takk>date
現在の日付: 2017/08/10
新しい日付を入力してください: (年-月-日)

C:\Users\takk>

日付と時間のコマンドは分かれており、時間を確認するにはtimeコマンドを打ち込まねばなりません。こちらも、現在の時刻は表示されるものの、新しい時刻まで要求されます。


C:\Users\takk>time
現在の時刻: 22:02:45.32
新しい時刻を入力してください:

C:\Users\takk>

純粋に日付や時刻を表示だけしたい場合は、/tオプションをつけます。

C:\Users\takk>date /t
2017/08/10

C:\Users\takk>time /t
22:00

C:\Users\takk>

日付や時刻を確認したいだけなら、カレンダーや時計に目を飛ばせば良いしコマンド入力するより早いので、これらのコマンドを使う必要はありません。
人間が確認するためではなく、dateやtimeの結果をテキストに埋め込んだり、制御に使用したりする場合に活きてきます。

dateコマンドの結果を使用するバッチファイルを作ってみましょう。

test.bat

FOR /f "usebackq" %%var IN ('date /t') DO if %%var==2017/08/10 echo 今日はハトの日です。

日付が、2017/08/10と一致すれば、今日はハトの日です。と表示されます。

C:\Users\takk\aaa>FOR /f "usebackq" %var IN ('date /t') DO if %var==2017/08/10 echo 今日はハトの日です。

mklink シンボリックリンク

ずっとWindowsではシンボリックリンクが作れないと思ってました。知らずに損してましたが、mklinkってコマンドで、シンボリックリンクも、ハードリンクも作ることができます。
まずおさらいで、Linuxのシンボリックリンクから見てみます。

ファイルのシンボリックリンク(Linux)

takk@takkpc:~/aaa$ echo hello > file1.txt
takk@takkpc:~/aaa$ ln -s file1.txt file2.txt
takk@takkpc:~/aaa$ cat file2.txt
hello

ファイルのシンボリックリンク(Windows)
Windowsでは、パラメータの指定順序が逆になります。linuxは左から右の法則なので、それと逆と覚えておけばよいです。

C:\Users\takk\aaa>echo hello > file1.txt

C:\Users\takk\aaa>type file1.txt
hello

C:\Users\takk\aaa>mklink file2.txt file1.txt
file2.txt <<===>> file1.txt のシンボリック リンクが作成されました

C:\Users\takk\aaa>type file2.txt
hello

C:\Users\takk\aaa>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C288-F709 です

 C:\Users\takk\aaa のディレクトリ

2017/08/15  18:07    <DIR>          .
2017/08/15  18:07    <DIR>          ..
2017/08/15  18:07                 8 file1.txt
2017/08/15  18:07    <SYMLINK>      file2.txt [file1.txt]
               2 個のファイル                   8 バイト
               2 個のディレクトリ  98,862,325,760 バイトの空き領域

C:\Users\takk\aaa>

ディレクトリのシンボリックリンク(Linux)
Linuxではディレクトリのシンボリックリンクもファイルと同じです。

takk@takkpc:~/aaa$ mkdir dir1
takk@takkpc:~/aaa$ mv file1.txt dir1/
takk@takkpc:~/aaa$ ln -s dir1 dir2
takk@takkpc:~/aaa$ ls dir2
file1.txt
takk@takkpc:~/aaa$

ディレクトリのシンボリックリンク(Windows)
Windowsでは、ディレクトリの場合、/Dオプションが必要になります。

C:\Users\takk\aaa>mkdir dir1

C:\Users\takk\aaa>mklink /d dir2 dir1
dir2 <<===>> dir1 のシンボリック リンクが作成されました

C:\Users\takk\aaa>move file1.txt dir1\
        1 個のファイルを移動しました。

C:\Users\takk\aaa>dir /b dir2
file1.txt

C:\Users\takk\aaa>

schtasks スケジュール実行

shctasksは、スケジュール実行をしてくれるコマンドで、このように使います。

C:\Users\takk>schtasks /create /tn ttt /sc once /st 21:32 /tr notepad
成功: スケジュール タスク "ttt" は正しく作成されました。

C:\Users\takk>

上記の例の各オプションの意味は、
/create が、スケジュールの作成
/tn が、タスクネーム。適当にtttとしていますが、”スケジュール1″等、日本語も使えます。
/sc は、タスクをどのように実行するか。例では、一回だけ実行の意味で、onceを指定しています。
/st は、コマンドの実行時間です。
/tr は、実行するコマンドです。notepadを指定してますので、21時32分になると、メモ帳が起動します。

notepadの代わりに、echo HELLOなんて書いても、実行されるのは別プロセスですので、当然動きません。

コマンドプロンプトのコンソールと同期をとりたければ、waitforコマンドが使えますので、
受信側で、waitfor /t 待ち時間 シグナル文字列
送信側で、waitfor /si シグナル文字列
を実行すれば良いです。

では、このwaitforを使って、指定時間に、時刻を表示してみます。

C:\Users\takk>time /t
22:16

C:\Users\takk>schtasks /create /tn ttt /sc once /st 22:20 /tr "waitfor /si HELLO
"
成功: スケジュール タスク "ttt" は正しく作成されました。

C:\Users\takk>waitfor /t 1000 HELLO & time /t

成功: シグナルを受信しました。
22:20

C:\Users\takk>

fsutil FSユーティティ

fsutilにどのような機能があるのでしょう。引数なしで実行するとサポートコマンドが表示されます。

C:\Users\takk2>fsutil
---- サポートされているコマンド ----

8dot3name         8dot3name management
behavior          ファイル システムの動作の制御
dax               DAX ボリュームの管理
dirty             ボリュームの dirty ビットの管理
file              ファイルに固有のコマンド
fsInfo            ファイル システム情報
hardlink          ハードリンクの管理
objectID          オブジェクト ID の管理
quota             クォータの管理
repair            自己復旧の管理
reparsePoint      再解析ポイントの管理
storageReserve    記憶域予約の管理
resource          トランザクション リソース マネージャーの管理
sparse            スパース ファイルの管理
tiering           記憶域階層化プロパティの管理
transaction       トランザクションの管理
usn               USN の管理
volume            ボリュームの管理
wim               透過的な wim ホスティングの管理

C:\Users\takk2>

オプションっていうよりも、サブコマンドを指定するんですね。
19個もあります。
ヘルプは表示されるでしょうか。

C:\Users\takk2>fsutil /?
/? は無効なパラメーターです。
---- サポートされているコマンド ----

8dot3name         8dot3name management
behavior          ファイル システムの動作の制御
dax               DAX ボリュームの管理

~省略~

ヘルプはないようです。fsutilをパラメータなしで実行したときと同じ一覧が表示されました。

次はサブコマンドを指定します。

C:\Users\takk2>fsutil 8dot3name
---- サポートされる 8DOT3NAME コマンド ----

query   システム上の短い名前の動作について現在の設定を照会
scan    影響を受けるレジストリ エントリを検出
set     システム上の短い名前の動作を制御する設定を変更
strip   ディレクトリ内のすべてのファイルの短い名前を削除

C:\Users\takk2>

queryを実行してみます。

C:\Users\takk2>fsutil 8dot3name query
レジストリの状態は 2 です (ボリューム単位で設定します - 既定値)。

C:\Users\takk2>

サブコマンドの一覧と説明も見れるので、ヘルプはいらないですね。

fsutil behavior

fsutil 8dot3name。ヘルプを一通り表示してみます。

C:\Users\takk2>fsutil 8dot3name
---- サポートされる 8DOT3NAME コマンド ----

query   システム上の短い名前の動作について現在の設定を照会
scan    影響を受けるレジストリ エントリを検出
set     システム上の短い名前の動作を制御する設定を変更
strip   ディレクトリ内のすべてのファイルの短い名前を削除

C:\Users\takk2>

8dot3nameってネーミング、すごく分かりやすいですねえ。
順に確認していきます。

C:\Users\takk2>fsutil 8dot3name query
レジストリの状態は 2 です (ボリューム単位で設定します - 既定値)。

C:\Users\takk2>

2って意味が分かりませんが、まあ今回はヘルプの表示だけなのでスルー。
次です。

C:\Users\takk2>fsutil 8dot3name scan
使用法 : fsutil 8dot3name scan </s> </l ログ ファイル> </v> ディレクトリ パス

このコマンドは、指定されたディレクトリ パスをスキャンして、このパスから
短い名前が削除された場合に影響を受けるレジストリ キーを検索します。

  /s - 再帰モード - 同じ操作をサブディレクトリにも適用するように指定します。
  /v - 詳細モード - ログに記録される情報をすべてコンソールにも出力するように
          指定します。
  /l - 書き込み先のログ ファイルを指定します。ログ ファイルへのパスを続けて
       指定する必要があります。このオプションを指定しない場合は、次のログ
       ファイルが使用されます:
            "%temp%\8dot3_removal_log@(GMT YYYY-MM-DD HH-MM-SS).log"

コマンドの使用例:
  "fsutil 8dot3name scan /l mylogfile.log /s D:\MyData"

C:\Users\takk2>

2つ続きます。

C:\Users\takk2>fsutil 8dot3name set
使用法 : fsutil 8dot3name set [0 から 3] | [<ボリューム パス> 1 | 0]

ボリューム パスが指定されていない場合、レジストリ値が更新されます。

    0 - システムのすべてのボリュームで 8dot3 名の作成を有効にする
    1 - システムのすべてのボリュームで 8dot3 名の作成を無効にする
    2 - 8dot3 名の作成をボリューム単位で設定する
    3 - システム ボリュームを除くすべてのボリュームで 8dot3 名の作成を
              無効にする

    ボリュームを指定した場合、個々のボリュームのオン ディスク フラグが更新されます。
        この操作は、レジストリ値が 2 に設定されている場合にのみ
        意味があります。

    0 - このボリュームで 8dot3 名の作成を有効にする
    1 - このボリュームで 8dot3 名の作成を無効にする

この操作はすぐに有効になります (再起動は不要です)。

コマンドの使用例:
  "fsutil 8dot3name set 1"      - すべてのボリュームで 8dot3 名の作成を無効にします
  "fsutil 8dot3name set C: 1"   - c: で 8dot3 名の作成を無効にします

C:\Users\takk2>
C:\Users\takk2>fsutil 8dot3name strip
使用法 : fsutil 8dot3name strip </t> </s> </f> </l ログ ファイル>
                                </v> ディレクトリ パス

このコマンドを実行すると、ボリュームから 8dot3 ファイル名が完全に削除されます。
削除された 8dot3 名を指し示すレジストリ キーの一覧が表示されますが、影響を
受けるそれらのレジストリ キーの変更は行われません。260 文字の最大パス長よりも
完全パス名が長いファイルに対しては、削除を実行できません。

***警告***
レジストリ キーに影響が及ぶ場合に、強制スイッチ /f を使用するときは、想定外の
アプリケーション エラー (アンインストールできなくなるなど) を招く危険がある
ため、ボリュームのバックアップを作成しておくことをお勧めします。

  /t - テスト モード - 実際のファイル名の削除以外のすべての操作を実行する
          ように指定します。
  /s - 再帰モード - 同じ操作をサブディレクトリにも適用するように指定します。
  /f - 強制モード - レジストリに競合が生じる場合でも、ディレクトリを削除する
          ように指定します。
  /v - 詳細モード - ログに記録される情報をすべてコンソールにも出力するように
          指定します。
  /l - 書き込み先のログ ファイルを指定します。ログ ファイルへのパスを続けて
          指定する必要があります。このオプションを指定しない場合は、次のログ
          ファイルが使用されます:
            "%temp%\8dot3_removal_log@(GMT YYYY-MM-DD HH-MM-SS).log"

コマンドの使用例:
  "fsutil 8dot3name strip /l mylogfile.log /s D:\MyData"

C:\Users\takk2>

ヘルプの量が多いですねえ。覚えられるでしょうか。

fsutil dax

今回は、daxです。短すぎて逆に忘れそうです。まあ、サークレットバウトって名前も長すぎて覚えられませんが。

C:\Users\takk2>fsutil dax
---- サポートされている DAX コマンド ----

queryFileAlignment        DAX ボリュームのファイルの配置を照会

C:\Users\takk2>

サブコマンド一つなら、いらない気がするのですが、まあヘルプを見てみましょう。

C:\Users\takk2>fsutil dax queryFileAlignment
使用法   : fsutil dax queryFileAlignment <ファイル名> [オプション]
オプション: q=<クエリ フラグ>        - クエリ フラグ。以下の値のオプションを参照: (既定値は both)
            値: large        - 大きいページの配置を照会します。
                   huge         - 非常に大きいページの配置を照会します。
                   both         - 大きいページと非常に大きいページの両方の配置を照会します。
            ** 注意: 非常に大きいページの配置の照会は、64 ビット アーキテクチャに限定されています。
          n=<範囲の数>  - 出力範囲の数。既定値=すべての範囲。
          s=<ファイル オフセット>       - 範囲の開始ファイル オフセット。既定値=0。
          l=<バイト単位の長さ>   - バイト単位の範囲の長さ。既定値=MAXLONGLONG-StartOffset

   例 : fsutil dax queryFileAlignment C:\Temp\sample.txt
      : fsutil dax queryFileAlignment C:\Temp\sample.txt q=large
      : fsutil dax queryFileAlignment C:\Temp\sample.txt q=huge n=10
      : fsutil dax queryFileAlignment C:\Temp\sample.txt q=both s=0x100 l=0x10000
      : fsutil dax queryFileAlignment C:\Temp\sample.txt q=both n=10 s=0x100 l=0x10000

C:\Users\takk2>

引数にファイルを指定してみましょう。

C:\Users\takk2>echo HELLO > a.txt

C:\Users\takk2>fsutil dax queryFileAlignment a.txt
エラー:  この操作には DAX ボリュームが必要です。

C:\Users\takk2>

ん~。DAXボリュームって何なのでしょう。
このコマンドは学習中です。

fsutil dirty

C:\Users\takk2>fsutil dirty
---- サポートされる DIRTY コマンド ----

query           dirty ビットの照会
set             dirty ビットの設定

C:\Users\takk2>

サブコマンドは2つみたいですね。
以前から思ってましたが、なんだかヘルプに表示される言葉って難しいです。
照会って、要するにリードですよね。

C:\Users\takk2>fsutil dirty query
使用法 : fsutil dirty query <ボリューム パス名>
    例 : fsutil dirty query  C:

C:\Users\takk2>

query反対は、answerな気もしますが、setなんですね。

C:\Users\takk2>fsutil dirty set
使用法 : fsutil dirty set <ボリューム パス名>
    例 : fsutil dirty set C:

C:\Users\takk2>

fsutil file

C:\Users\takk2>fsutil file
---- サポートされている FILE コマンド ----

createNew                指定したサイズの新しいファイルを作成
findBySID                セキュリティ識別子でファイルを検索
layout                   ファイルについて使用可能なすべての情報の照会
optimizeMetadata         ファイルのメタデータの最適化
queryAllocRanges         ファイルに割り当てられた範囲の照会
queryCaseSensitiveInfo   ディレクトリの大文字と小文字の区別に関する情報の照会
queryExtents             ファイルのエクステントの照会
queryExtentsAndRefCounts ファイルのエクステントと対応する参照カウントの照会
queryFileID              指定したファイルをファイル ID で照会
queryFileNameById        ファイル ID のランダム リンク名を表示
queryOptimizeMetadata    ファイルの最適化メタデータ状態を照会
queryValidData           ファイルの有効なデータ長を照会
setCaseSensitiveInfo     ディレクトリの大文字と小文字の区別に関する情報を設定
setShortName             ファイルの短い名前を設定
setValidData             ファイルの有効なデータ長を設定
setZeroData              ファイルのゼロ データを設定
setEOF                   既存ファイルのファイルの終わりを設定
setStrictlySequential    ReFS SMR ファイルを厳密に順次として設定

C:\Users\takk2>

一つずつサブコマンドを叩いていきましょう。

C:\Users\takk2>fsutil file createNew
使用法 : fsutil file createNew <ファイル名> <長さ>
   例 : fsutil file createNew C:\testfile.txt 1000

C:\Users\takk2>

次は、FindBySid。ファイル検索に使えそうです。

C:\Users\takk2>fsutil file findbysid
使用法 : fsutil file findBySID <ユーザー> <ディレクトリ>
   例 : fsutil file findBySID scottb C:\users

C:\Users\takk2>

とりあえずヘルプを全部たたいて確認していきます。

C:\Users\takk2>fsutil file layout
使用法: fsutil file layout <ファイル名>

   例 : fsutil file layout C:\testfile.txt

C:\Users\takk2>

長いコマンドですが、英語が省略されていないので覚えやすいです。

C:\Users\takk2>fsutil file optimizemetadata
使用法: fsutil file optimizeMetadata [/A] <ファイル名>
   /A : 最適化の前後にファイル メタデータを分析
   例: fsutil file optimizeMetadata c:\largefragmentedfile.txt
   例: fsutil file optimizeMetadata c:\$Secure:$SDS
   例: fsutil file optimizeMetadata c:\$MFT
   例: fsutil file optimizeMetadata c:\

C:\Users\takk2>

なんとなく慣れてきました。とにかく参照するにはqueryですね。

C:\Users\takk2>fsutil file queryallocranges
使用法: fsutil file queryAllocRanges offset=<値> length=<値> <ファイル名>
   offset : ファイルのオフセット、照会する範囲の開始点
   length : 範囲のサイズ (バイト)
   例 : fsutil file queryAllocRanges offset=1024 length=64 C:\Temp\sample.txt

C:\Users\takk2>

サブコマンドをかたっぱしから叩いて、覚えていきます。

C:\Users\takk2>fsutil file querycasesensitiveinfo
使用法 : fsutil file queryCaseSensitiveInfo <ディレクトリ名>
   例 : fsutil file queryCaseSensitiveInfo C:\TempFolder

C:\Users\takk2>

本当に長いコマンドですねえ。使いやすいのでしょうか。
そもそも覚えるコマンドではない気もしてきました。

C:\Users\takk2>fsutil file queryextents
使用法 : fsutil file queryExtents [/R] <ファイル名> [<開始 VCN> [<VCN 数>]] [csv]
   /R : If <ファイル名> が再解析ポイントの場合、ターゲットではなくそれを開きます
   <開始 VCN> : 照会する最初の VCN (省略した場合、VCN 0 から開始)
   <VCN 数> : 照会する VCN の数 (省略するか、0 の場合、EOF まで照会)
   csv : 結果を csv 形式で表示します
   例 : fsutil file queryExtents C:\Temp\sample.txt
        fsutil file queryExtents /R C:\Temp\sample.txt
        fsutil file queryExtents C:\Temp\sample.txt 10
        fsutil file queryExtents C:\Temp\sample.txt 10 100
        fsutil file queryExtents C:\Temp\sample.txt csv

C:\Users\takk2>

説明を読んではいますが、全然理解できてません。

C:\Users\takk2>fsutil file queryextentsandrefcounts
使用法 : fsutil file queryExtentsAndRefCounts [/R] <ファイル名> [<開始 VCN> [<VCN 数>]]
   /R : If <ファイル名> が再解析ポイントの場合、ターゲットではなくそれを開きます
   <開始 VCN> : 照会する最初の VCN (省略した場合、VCN 0 から開始)
   <VCN 数> : 照会する VCN の数 (省略するか、0 の場合、EOF まで照会)
   例 : fsutil file queryExtentsAndRefCounts C:\Temp\sample.txt

C:\Users\takk2>

というか、このヘルプ、分かってる人前提なのでは。

C:\Users\takk2>fsutil file queryfileid
使用法 : fsutil file queryFileID <ファイル名>
   例 : fsutil file queryFileID C:\testfile.txt

C:\Users\takk2>

何をするコマンドなのかは、たぶんコマンド名そのままってことなんでしょう。

C:\Users\takk2>fsutil file queryfilenamebyid
使用法 : fsutil file queryFileNameById <ボリューム パス名> <フィールド>
   例 : fsutil file queryFileNameById C:\ 0x00040000000001bf

C:\Users\takk2>

optimizeなので、最適化、メタデータを最適化する?

C:\Users\takk2>fsutil file queryoptimizemetadata
使用法: fsutil file queryOptimizeMetadata <ファイル名>
   例: fsutil file queryOptimizeMetadata c:\largefragmentedfile.txt
   例: fsutil file queryOptimizeMetadata c:\$Secure:$SDS
   例: fsutil file queryOptimizeMetadata c:\$MFT
   例: fsutil file queryOptimizeMetadata c:\

C:\Users\takk2>

使わないと、使い方が分からないという矛盾。

C:\Users\takk2>fsutil file queryvaliddata
使用法 : fsutil file queryValidData [/R] [/D] <ファイル名>
   /R : <ファイル名> が再解析ポイントの場合、ターゲットではなくそれを開きます
   /D : 有効なデータの詳細を表示します
   例 : fsutil file queryValidData C:\testfile.txt

C:\Users\takk2>

続きのサブコマンドを叩いていきます。

C:\Users\takk2>fsutil file setcasesensitiveinfo
使用法 : fsutil file setCaseSensitiveInfo <ディレクトリ名> [フラグ]
フラグ : enable   - <ディレクトリ名> の大文字と小文字を区別する属性を有効にする (既定値)
      : disable  - <ディレクトリ名> の大文字と小文字を区別する属性を無効にする
   例 : fsutil file setCaseSensitiveInfo C:\TempFolder enable
        fsutil file setCaseSensitiveInfo C:\TempFolder disable

C:\Users\takk2>

なんと、大文字小文字区別できるとは。

C:\Users\takk2>fsutil file setshortname
使用法: fsutil file setShortName <ファイル名> <短い名前>
   例 : fsutil file setShortName C:\testfile.txt testfile

C:\Users\takk2>

ショートネームも自由につけられるんですね。

C:\Users\takk2>fsutil file setvaliddata
使用法: fsutil file setValidData <ファイル名> <データの長さ>
   例 : fsutil file setValidData C:\testfile.txt 4096

C:\Users\takk2>

なんだか面白そうなコマンドです。

C:\Users\takk2>fsutil file setzerodata
使用法: fsutil file setZeroData offset=<値> length=<値> <ファイル名>
   offset : ファイル オフセット、ゼロに設定する範囲の開始点
   length : ゼロの範囲の長さ (バイト)
   例 : fsutil file setZeroData offset=100 length=150 C:\Temp\sample.txt

C:\Users\takk2>

EOFをどこに設定するか指定できるのでしょうか。今度調べてみようと思います。

C:\Users\takk2>fsutil file seteof
使用法 : fsutil file setEOF <ファイル名> <長さ>
   例 : fsutil file setEOF C:\testfile.txt 1000

C:\Users\takk2>

このコマンドは英語を見てもよく分らんですねえ。

C:\Users\takk2>fsutil file setstrictlysequential
使用法 : fsutil file setStrictlySequential <ファイル名>
   例 : fsutil file setStrictlySequential C:\testfile.txt

C:\Users\takk2>

fsutil file createnew 任意サイズのファイル生成

C:\Users\takk\tmp>fsutil file createnew
使用法 : fsutil file createnew <ファイル名> <長さ>
    例 : fsutil file createnew C:\testfile.txt 1000

C:\Users\takk\tmp>

任意の長さのファイルを作るコマンドです。
使ってみます。

PS C:\Users\takk\tmp> fsutil file createnew aa.txt 10
ファイル C:\Users\takk\tmp\aa.txt が作成されました
PS C:\Users\takk\tmp>

dirで確認すると、このように10Byteのファイルができています。

PS C:\Users\takk\tmp> dir


    ディレクトリ: C:\Users\takk\tmp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2018/06/17     22:11         10 aa.txt


PS C:\Users\takk\tmp>

値はオール0なのでしょうか。PowerShellを使って確認します。

C:\Users\takk\tmp>powershell
Windows PowerShell
Copyright (C) 2014 Microsoft Corporation. All rights reserved.

PS C:\Users\takk\tmp>
PS C:\Users\takk\tmp> gc -encoding byte aa.txt
0
0
0
0
0
0
0
0
0
0
PS C:\Users\takk\tmp>

オール0です。
いろいろ使えそうです。

fsutil file setzerodata ファイルのゼロ埋め

使用法の確認。

C:\Users\takk\tmp>fsutil file setzerodata
使用法 : fsutil file setzerodata offset=<値> length=<値> <ファイル名>
   offset : ファイルのオフセット、ゼロに設定する範囲の開始点
   length : ゼロの範囲の長さ (バイト)
   例 : fsutil file setzerodata offset=100 length=150 C:\Temp\sample.txt

C:\Users\takk\tmp>

変更前データとして7Byteのファイルを作成。

C:\Users\takk\tmp>echo ABCDE>aa.txt

C:\Users\takk\tmp>powershell
Windows PowerShell
Copyright (C) 2014 Microsoft Corporation. All rights reserved.

PS C:\Users\takk\tmp> gc -encoding byte aa.txt
65
66
67
68
69
13
10
PS C:\Users\takk\tmp>

では、setzerodataコマンドを使ってゼロで埋めてみます。

PS C:\Users\takk\tmp> fsutil file setzerodata offset=2 length=3 aa.txt
ゼロ データが変更されました
PS C:\Users\takk\tmp> gc -encoding byte aa.txt
65
66
0
0
0
13
10
PS C:\Users\takk\tmp>

offset=2を指定して3番目からゼロになったということは、
ファイル先頭からゼロにしたい場合は、offset=0を指定すればよいですね。

PS C:\Users\takk\tmp> fsutil file setzerodata offset=0 length=1 aa.txt
ゼロ データが変更されました
PS C:\Users\takk\tmp> gc -encoding byte aa.txt
0
66
0
0
0
13
10
PS C:\Users\takk\tmp>

0データでファイルを拡張できるでしょうか。offsetでファイルの末尾を指定してみます。

PS C:\Users\takk\tmp> fsutil file setzerodata offset=7 length=3 aa.txt
ゼロ データが変更されました
PS C:\Users\takk\tmp> gc -encoding byte aa.txt
0
66
0
0
0
13
10
PS C:\Users\takk\tmp>

ファイルの長さは変更されませんでした。

PS C:\Users\takk\tmp> dir aa.txt


    ディレクトリ: C:\Users\takk\tmp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2018/06/18     20:49          7 aa.txt


PS C:\Users\takk\tmp>

Get-Content(gc)で見ても、dirで見ても、ファイルサイズは変わってません。
setzerodataではファイルサイズは変えられないようです。

net user

ヘルプを確認。

C:\Users\takk\Desktop>net user /?
このコマンドの構文は次のとおりです:

NET USER
[ユーザー名 [パスワード | *] [オプション]] [/DOMAIN]
         ユーザー名 {パスワード | *} /ADD [オプション] [/DOMAIN]
         ユーザー名 [/DELETE] [/DOMAIN]
         ユーザー名 [/TIMES:{時間 | ALL}]
         ユーザー名 [/ACTIVE: {YES | NO}]


C:\Users\takk\Desktop>

net userをパラメータなしで、cmdから実行してみます。


C:\Users\takk\Desktop>net user

\\DESKTOP-TRO4JUU のユーザー アカウント

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
takkc                    takk                     WDAGUtilityAccount
コマンドは正常に終了しました。


C:\Users\takk\Desktop>

Guestに見知らぬWDAGUtilityAccountというユーザがいます。
net userの引数にユーザ名を指定すると、詳細が確認できます。

C:\Windows\system32>net user WDAGUtilityAccount
ユーザー名                           WDAGUtilityAccount
フル ネーム
コメント                             Windows Defender Application Guard シナリオでシステムによって管理および使用されるユーザー アカウント
ユーザーのコメント
国/地域番号                          000 (システム既定)
アカウント有効                       No
アカウントの期限                     無期限

最終パスワード変更日時               2019/01/14 18:16:21
パスワード有効期間                   2019/02/25 18:16:21
パスワード次回変更可能日時           2019/01/14 18:16:21
パスワードあり                       Yes
ユーザーによるパスワード変更可能     Yes

ログオン可能なワークステーション     すべて
ログオン スクリプト
ユーザー プロファイル
ホーム ディレクトリ
最終ログオン日時                     なし

ログオン可能時間                     すべて

所属しているローカル グループ
所属しているグローバル グループ      *なし
コマンドは正常に終了しました。


C:\Windows\system32>

自動で作成されたユーザのようです。気にしないで次に進むことにします。

次は、/addコマンドを使ってユーザを追加してみます。

C:\Users\takk\Desktop>net user testuser /add
システム エラー 5 が発生しました。

アクセスが拒否されました。


C:\Users\takk\Desktop>

エラーになりました。

管理者権限が必要でした。cmdを実行するときに、以下のように管理者として実行する必要があります。

次は、管理者として実行したcmd上で確認してみます。

Microsoft Windows [Version 10.0.17763.253]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>net user testuser /add
コマンドは正常に終了しました。


C:\Windows\system32>

では、net userを引数なしで実行。


C:\Windows\system32>net user
\\DESKTOP-TRO4JUU のユーザー アカウント

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
takkc                    takk                     testuser
WDAGUtilityAccount
コマンドは正常に終了しました。


C:\Windows\system32>

Guestにtestuserが追加されています。

もう一つ追加してみます。

C:\Windows\system32>net user testuser2 /add
コマンドは正常に終了しました。


C:\Windows\system32>net user

\\DESKTOP-TRO4JUU のユーザー アカウント

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
takkc                    takk                     testuser
testuser2                WDAGUtilityAccount
コマンドは正常に終了しました。


C:\Windows\system32>

Guestユーザの表示方法がいただけないですねえ。なぜ変な改行が入っているのか。

次はユーザの削除をしてみます。testuserを削除しましょう。

Microsoft Windows [Version 10.0.17763.253]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>net user

\\DESKTOP-TRO4JUU のユーザー アカウント

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
takkc                    takk                     testuser
testuser2                WDAGUtilityAccount
コマンドは正常に終了しました。


C:\Windows\system32>net user testuser /delete
コマンドは正常に終了しました。


C:\Windows\system32>net user

\\DESKTOP-TRO4JUU のユーザー アカウント

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
takkc                    takk                     testuser2
WDAGUtilityAccount
コマンドは正常に終了しました。


C:\Windows\system32>

cacls

今回はcalcsを使います。
ファイルのアクセス権の表示や変更をしてくれるコマンドです。
cmd上で、ヘルプから確認してみます。

Microsoft Windows [Version 10.0.17763.253]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\takk>cacls

 注意: CACLS の使用は推奨されていません。ICACLS を使用してください。

 ファイルのアクセス制御リスト (ACL) を表示または変更します。

 CACLS ファイル名 [/T] [/M] [/L] [/S[:SDDL]] [/E] [/C]
                   [/G ユーザー名:アクセス権] [/R ユーザー名 [...]]
                   [/P ユーザー名:アクセス権 [...]] [/D ユーザー名 [...]]
    ファイル名     ACL を表示します。
    /T             現在のディレクトリとすべてのサブディレクトリにある
                   指定されたファイルの ACL を変更します。
    /L             ターゲットではなくシンボリック リンク自体で動作します
    /M             ディレクトリにマウントされたボリュームの ACL を変更します
    /S             DACL の SDDL 文字列を表示します。
    /S:SDDL        ACL を SDDL 文字列で指定されたもので置き換えます
                   (/E、/G、/R、/P、または /D では無効)。
    /E             ACL を置き換えずに編集します。
    /C             アクセス拒否エラーを無視して、アクセスを続行します。
    /G ユーザー名:アクセス権
                   指定されたユーザーにアクセス権を与えます。
                   アクセス権: R  読み取り
                               W  書き込み
                               C  変更 (書き込み)
                               F  フル コントロール
    /R ユーザー名
                   指定されたユーザーのアクセス権を失効させます
                   (/E オプションと共に使用)。
    /P ユーザー名:アクセス権
                   指定されたユーザーのアクセス権を置き換えます。
                   アクセス権: N  なし
                               R  読み取り
                               W  書き込み
                               C  変更 (書き込み)
                               F  フル コントロール
    /D ユーザー名  指定されたユーザーのアクセスを拒否します。
 複数のファイルを指定するには、ワイルドカードを使用できます。
 複数のユーザーを指定できます。

 省略形:
    CI - コンテナー継承。
         ACE はディレクトリに継承されます。
    OI - オブジェクト継承。
         ACE はファイルに継承されます。
    IO - 継承のみ。
         ACE は現在のファイル/ディレクトリに適用されません。
    ID - 継承済み。
         ACE は親ディレクトリの ACL から継承されました。

C:\Users\takk>

いきなり、「CACLS の使用は推奨されていません。」
と言われてしまいました、
ICACLSを使った方が良さそうなのですが、違いを知るためにも、まずはCACLSを使ってみます。


C:\Users\takk\Desktop>echo HELLO > test.txt

C:\Users\takk\Desktop>cacls test.txt
C:\Users\takk\Desktop\test.txt <アカウント ドメインが見つかりません>(ID)F
                               NT AUTHORITY\SYSTEM:(ID)F
                               BUILTIN\Administrators:(ID)F
                               DESKTOP-TRO4JUU\takk:(ID)F


C:\Users\takk\Desktop>

他のユーザにフルコントロールの権限を与えてみます。

C:\Users\takk\Desktop>net user

\\DESKTOP-TRO4JUU のユーザー アカウント

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
takkc                    takk                     testuser2
WDAGUtilityAccount
コマンドは正常に終了しました。


C:\Users\takk\Desktop>cacls test.txt /g testuser2:f
よろしいですか (Y/N)?y
処理ファイル: C:\Users\takk\Desktop\test.txt

C:\Users\takk\Desktop>

ファイルの権限を確認。

C:\Users\takk\Desktop>cacls test.txt
C:\Users\takk\Desktop\test.txt DESKTOP-TRO4JUU\testuser2:F


C:\Users\takk\Desktop>

あれ、testuser2にしか権限がついてません。
他のユーザの権限は消えてしまったのでしょうか。

一応、プロパティでも確認すると、

testusr2しか表示されません。

このファイルを削除しようとすると、もちろん。

管理者権限のcmdから、前回作成したtest.txtを削除します。


C:\Users\takk\Desktop>del test.txt

C:\Users\takk\Desktop>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 20C6-F2AA です

 C:\Users\takk\Desktop のディレクトリ

2019/01/20  16:03    <DIR>          .
2019/01/20  16:03    <DIR>          ..
               0 個のファイル                   0 バイト
               2 個のディレクトリ  186,578,243,584 バイトの空き領域

C:\Users\takk\Desktop>

再度test.txtを作成。


C:\Users\takk\Desktop>echo HELLO > test.txt

C:\Users\takk\Desktop>cacls test.txt
C:\Users\takk\Desktop\test.txt <アカウント ドメインが見つかりません>(ID)F
                               NT AUTHORITY\SYSTEM:(ID)F
                               BUILTIN\Administrators:(ID)F
                               DESKTOP-TRO4JUU\takk:(ID)F


C:\Users\takk\Desktop>

今度は、既存の権限を維持したまま、testuser2の権限のみ付与します。
caclsの/eオプションを使います。

C:\Users\takk\Desktop>cacls test.txt /e /g testuser2:f
処理ファイル: C:\Users\takk\Desktop\test.txt

C:\Users\takk\Desktop>

さて、ファイルの権限はどう変わっているでしょうか。

C:\Users\takk\Desktop\test.txt DESKTOP-TRO4JUU\testuser2:F
                               <アカウント ドメインが見つかりません>(ID)F
                               NT AUTHORITY\SYSTEM:(ID)F
                               BUILTIN\Administrators:(ID)F
                               DESKTOP-TRO4JUU\takk:(ID)F


C:\Users\takk\Desktop>

testuser2のみが追加されて、他のユーザはそのままです。今度はうまくいきました。

icacls

caclsを使おうとすると、icaclsの使用を推奨されるので、icaclsを学習していこうと思います。
まずはヘルプ。

C:\Users\takk>icacls

ICACLS <名前> /save <ACL ファイル> [/T] [/C] [/L] [/Q]
    名前が一致するすべてのファイルとフォルダーの DACL を <ACL ファイル> に
    格納して、後で /restore で指定できるようにします。SACL、所有者、整合性

~省略~

ヘルプが盛りだくさん。
何行あるのでしょうか。

C:\Users\takk\Desktop>icacls | wsl wc -l
136

C:\Users\takk\Desktop>

コマンドがたくさんあるようなので、少しずつ見ていくことにします。

まずはファイル名を指定して実行。

C:\Users\takk\Desktop>icacls test.txt
test.txt DESKTOP-TRO4JUU\testuser2:(F)
         NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

ファイルに付与されている権限が確認できました。

icacls /remove 権限削除

testuser2の権限を削除してみましょう。

C:\Users\takk\Desktop>icacls test.txt /remove:g testuser2
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>icacls test.txt

0個のファイルを処理できませんでしたって日本語は、何なんでしょう。
まあ、成功したってことですね。

確認してみます。

C:\Users\takk\Desktop>icacls test.txt
test.txt NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

testuser2が削除されてます。うまくいきました。

/removeコマンドに関してicaclsのヘルプを確認すると、このような説明となっています。

    /remove[:[g|d]] <SID> は、ACL 内にあるすべての <SID> を削除します。
        :g を指定すると、その SID に対して許可されたすべての権限を ACL から
        削除します。
        :d を指定すると、その SID に対して拒否されたすべての権限を ACL から
        削除します。

また、よくわからない説明です。:dを指定すると、拒否されたすべての権限・・・。
まあ、やってみればわかることです。

再びtestuser2の権限を与えるために、前回使ったcaclsを使います。(まだicaclsでの権限付与は知らないので・・・)

C:\Users\takk\Desktop>cacls test.txt /e /g testuser2:f
処理ファイル: C:\Users\takk\Desktop\test.txt

C:\Users\takk\Desktop>icacls test.txt
test.txt DESKTOP-TRO4JUU\testuser2:(F)
         NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

では、/remove:d を使ってみましょう。

C:\Users\takk\Desktop>icacls test.txt /remove:d testuser2
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

コマンドで確認します。

C:\Users\takk\Desktop>icacls test.txt
test.txt DESKTOP-TRO4JUU\testuser2:(W)
         NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

(W)、つまり書き込み権限のみですね。
ファイルのプロパティを見ると、

やはり、書き込みだけが残りました。

icacls /grant 権限付与

権限の付与は、/grantです。

書式

ICACLS <名前> [/grant[:r] <SID>:perm[...]]

/removeで要領を得たので、書式を見ただけで使えそうな気がします。

新規ファイルを作って、testuser2にフルコントロールの権限を与えてみます。


C:\Users\takk\Desktop>echo HELLO >test2.txt

C:\Users\takk\Desktop>icacls test2.txt
test2.txt NT AUTHORITY\SYSTEM:(I)(F)
          BUILTIN\Administrators:(I)(F)
          DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

では、testuser2に権限付与します。

C:\Users\takk\Desktop>icacls test2.txt /grant testuser2:f
処理ファイル: test2.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

権限は付与されているでしょうか。

C:\Users\takk\Desktop>icacls test2.txt
test2.txt DESKTOP-TRO4JUU\testuser2:(F)
          NT AUTHORITY\SYSTEM:(I)(F)
          BUILTIN\Administrators:(I)(F)
          DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

testuser2に(F)がついているので、成功です。

では、/grantの説明を読んでみます。

    /grant[:r] <SID>:perm は、指定されたユーザー アクセス権を付与します。
        :r を指定すると、以前に付与されたすべての明示的なアクセス許可は新しい
        アクセス許可に置き換えられます。
        :r を指定しない場合、新しいアクセス許可は以前に付与された明示的な
        アクセス許可に追加されます。

ん~。また、よく分からない説明。「明示的なアクセス許可」とは?

ファイル作成者以外の権限を一発で削除してみます。

icacls /inheritance

icaclsのオプションの、/inheritanceを使います。

    /inheritance:e|d|r
        e - 継承を有効にします。
        d - 継承を無効にし、ACE をコピーします。
        r - 継承された ACE をすべて削除します。

では最初に、実験用ファイルを作成。


C:\Users\takk\Desktop>echo HELLO > test.txt

C:\Users\takk\Desktop>icacls test.txt
test.txt S-1-5-21-282166592-494520350-4258074492-1003:(I)(F)
         NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

今作成したtest.txtには、4つのアカウント(SID)にフルコントロールが付与されていますね。
全部の権限を削除してみます。

C:\Users\takk\Desktop>icacls test.txt /inheritance:r
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

これで削除されました。
確認してみます。

C:\Users\takk\Desktop>icacls test.txt
test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

先ほどあったアカウントの表示が消えていますが、よくわかりません。
ファイルのプロパティを見てみましょう。

確かに消えています。
次は、これを使います。

ICACLS <名前> /findsid <SID> [/T] [/C] [/L] [/Q]
ICACLS <名前> /findsid <SID> [/T] [/C] [/L] [/Q]
    <SID> が明示されている ACL を含むすべての一致する名前を検索します。

いつものように実験に使いファイル作成。

C:\Users\takk\Desktop>echo HELLO > test.txt

C:\Users\takk\Desktop>icacls test.txt
test.txt S-1-5-21-282166592-494520350-4258074492-1003:(I)(F)
         NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

今回はicaclsのその5なので、何度も使ってきたわけですが、icaclsってコマンド、ほんと覚えにくいです。
wikipediaでは「Integrity Control Access Control List」の略らしく、簡単な単語の組み合わせであるにもかかわらず、覚えることができません。でも、大丈夫です。もう英語がわけわかんなすぎて(なんでControlが二回も出てくるんだ!) と、怒りを覚えることはできます。

では、使ってみましょう。

C:\Users\takk\Desktop>icacls test.txt /findsid takk
SID が見つかりました: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

ん~。何が面白いのか分かりません。 ファイルを増やしてみます。

C:\Users\takk\Desktop>copy test.txt test2.txt
        1 個のファイルをコピーしました。

C:\Users\takk\Desktop>icacls test.txt /grant testuser2:f
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

test.txtとtest2.txtがあり、test.txtのみtestuser2に権限を付与しました。
icaclsで確認するとこのような状態です。

C:\Users\takk\Desktop>icacls test*
test.txt DESKTOP-TRO4JUU\testuser2:(F)
         S-1-5-21-282166592-494520350-4258074492-1003:(I)(F)
         NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

test2.txt S-1-5-21-282166592-494520350-4258074492-1003:(I)(F)
          NT AUTHORITY\SYSTEM:(I)(F)
          BUILTIN\Administrators:(I)(F)
          DESKTOP-TRO4JUU\takk:(I)(F)

2 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

では、アカウントを指定して、権限付与されているファイルを確認してみます。

C:\Users\takk\Desktop>icacls t* /findsid testuser2
SID が見つかりました: test.txt
2 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>icacls t* /findsid takk
SID が見つかりました: test.txt
SID が見つかりました: test2.txt
2 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

なるほど、このように使うのですね。

icacls /setowner

ICACLS <名前> /setowner <ユーザー> [/T] [/C] [/L] [/Q]
    すべての一致する名前の所有者を変更します。このオプションでは、所有権の
    変更を強制することはできません。所有権を変更するには、takeown.exe
    ユーティリティを使用してください。

現在、カレントディレクトリには、ファイルが2つあります。

C:\Users\takk\Desktop>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 20C6-F2AA です

 C:\Users\takk\Desktop のディレクトリ

2019/01/26  21:41    <DIR>          .
2019/01/26  21:41    <DIR>          ..
2019/01/26  20:35                 8 test.txt
2019/01/26  20:35                 8 test2.txt
               2 個のファイル                  16 バイト
               2 個のディレクトリ  178,863,869,952 バイトの空き領域

C:\Users\takk\Desktop>

dirの/qオプションで ファイルの所有者を確認することができます。

C:\Users\takk\Desktop>dir /q
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 20C6-F2AA です

 C:\Users\takk\Desktop のディレクトリ

2019/01/26  21:41    <DIR>          DESKTOP-TRO4JUU\takk   .
2019/01/26  21:41    <DIR>          BUILTIN\Administrators ..
2019/01/26  20:35                 8 DESKTOP-TRO4JUU\takk   test.txt
2019/01/26  20:35                 8 DESKTOP-TRO4JUU\takk   test2.txt
               2 個のファイル                  16 バイト
               2 個のディレクトリ  178,880,303,104 バイトの空き領域

C:\Users\takk\Desktop>

では、icaclsで/setownerを使ってみます。

C:\Users\takk\Desktop>icacls test2.txt /setowner testuser2
test2.txt: このセキュリティ ID はこのオブジェクトの所有者として割り当てられていない可能性があります。
0 個のファイルが正常に処理されました。1 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

あれっ。できません。ヘルプの説明には、「このオプションでは、所有権の変更を強制することはできません。所有権を変更するには、takeown.exe ユーティリティを使用してください。」 とありましたので、takeownを使ってみます。

使ってみます。

C:\Users\takk\Desktop>takeown
エラー: 構文が無効です。
"TAKEOWN /?" と入力すると使用法が表示されます。

C:\Users\takk\Desktop>

ヘルプは/?のようです。

C:\Users\takk\Desktop>takeown /?

TAKEOWN [/S システム [/U ユーザー名 [/P [パスワード]]]]
        /F ファイル名 [/A] [/R [/D プロンプト]]

説明:
    このツールを使うと、ファイルの所有権を割り当て直して、前回アクセスが拒否
    されたファイルへのアクセスを管理者が回復できるようにします。

パラメーター一覧:
    /S     システム              接続先のリモート システムを指定
                                 します。

    /U     [ドメイン\]ユーザー   コマンドを実行するユーザー
                                 コンテキストを指定します。

    /P     [パスワード]          指定のユーザー コンテキストのパスワード
                                 を指定します。
                                 省略すると入力が促されます。

    /F     ファイル名            ファイル名またはディレクトリ名のパターンを
                                 指定します。ワイルドカード "*" を使って
                                 パターンを指定できます。
                                 '共有名\ファイル名' も使用できます。

    /A                           現在のユーザーではなく、管理者に所有権を
                                 与えます。

    /R                           再帰: 指定されたディレクトリとすべてのサブ
                                 ディレクトリにあるファイルに対してツールを
                                 実行します。

    /D     プロンプト            ユーザーがディレクトリに対し "フォルダーの一覧"
                                 アクセス許可を持っていない場合、既定の答えが
                                 使用されます。これはサブディレクトリに対し                                      再帰的(/R) に操作を行っている場合に適用され
                                 ます。有効な値は "Y" (所有権を得る)、および                                     "N" (スキップ) です。

    /SKIPSL                      シンボリック リンクに接続しません。
                                 /R と同時には指定できません。

    /?                           このヘルプを表示します。

    注意: 1) /A が指定されていない場合は、ファイルの所有権は現在
             ログインしているユーザーに与えられます。

          2) "?" や "*" を使った混合パターンはサポートされていません。

          3) /D を使うと、確認プロンプトは表示されません。

例:
    TAKEOWN /?
    TAKEOWN /F lostfile
    TAKEOWN /F \\system\share\lostfile /A
    TAKEOWN /F directory /R /D N
    TAKEOWN /F directory /R /A
    TAKEOWN /F *
    TAKEOWN /F C:\Windows\System32\acme.exe
    TAKEOWN /F %windir%\*.txt
    TAKEOWN /S システム /F MyShare\Acme*.doc
    TAKEOWN /S システム /U ユーザー /F MyShare\MyBinary.dll
    TAKEOWN /S システム /U ドメイン\ユーザー /P パスワード /F share\ファイル名
    TAKEOWN /S システム /U ユーザー /P パスワード /F Doc\Report.doc /A
    TAKEOWN /S システム /U ユーザー /P パスワード /F Myshare\*
    TAKEOWN /S システム /U ユーザー /P パスワード /F Home\Logon /R
    TAKEOWN /S システム /U ユーザー /P パスワード /F Myshare\directory /R /A

C:\Users\takk\Desktop>

ん~。使い勝手が悪そうですが、ファイルの権限を管理者に変更してみます。

C:\Users\takk\Desktop>takeown /A /F test2.txt
エラー: 現在ログオンしているユーザーには管理者の権限がありません。

C:\Users\takk\Desktop>

なんてことでしょう。うまくいきません。
cmd.exe自体を管理者権限で実行しておく必要があるんでしょうか。
ファイルの所有者が自由に権限を与えられないって何だろう。。。
sudo が使えないって不便ですねえ。

管理者権限で起動したcmd上で、実行すると、もちろん成功します。

C:\Users\takk\Desktop>takeown /A /F test2.txt

成功: ファイル (またはフォルダー): "C:\Users\takk\Desktop\test2.txt" は現在 Administrators グループによって所有されてい ます。

C:\Users\takk\Desktop>

ってことは、icaclsの/setownerも管理者権限で実行すれば、うまくいくのでしょうねえ。

C:\Users\takk\Desktop>icacls test.txt /setowner testuser2
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

所有者を確認してみます。

C:\Users\takk\Desktop>dir /q
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 20C6-F2AA です

 C:\Users\takk\Desktop のディレクトリ

2019/01/26  21:41    <DIR>          DESKTOP-TRO4JUU\takk   .
2019/01/26  21:41    <DIR>          BUILTIN\Administrators ..
2019/01/26  20:35                 8 DESKTOP-TRO4JUU\testusetest.txt
2019/01/26  20:35                 8 BUILTIN\Administrators test2.txt
               2 個のファイル                  16 バイト
               2 個のディレクトリ  178,880,651,264 バイトの空き領域

C:\Users\takk\Desktop>

うわああ、所有者の文字列がファイル列の文字列がかぶって全部見えません。
Windowsコマンドには、げんなりさせられますねえ。

icacls /reset

ICACLS <名前> /reset [/T] [/C] [/L] [/Q]
    すべての一致するファイルについて、ACL を継承された既定の ACL と置換します。

説明を読んでも、よくわからないので、使ってみましょう。

いつものように実験ファイルを作ります。

C:\Users\takk\Desktop>echo HELLO > test.txt

C:\Users\takk\Desktop>icacls test.txt
test.txt S-1-5-21-282166592-494520350-4258074492-1003:(I)(F)
         NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

では/resetします。

C:\Users\takk\Desktop>icacls test.txt /reset
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>icacls test.txt
test.txt S-1-5-21-282166592-494520350-4258074492-1003:(I)(F)
         NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

変化なしです。

では他アカウントへ権限を付与してみます。

C:\Users\takk\Desktop>icacls test.txt /grant testuser2:f
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>icacls test.txt
test.txt DESKTOP-TRO4JUU\testuser2:(F)
         S-1-5-21-282166592-494520350-4258074492-1003:(I)(F)
         NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

/resetを実行すると、この付与した権限が元に戻る、つまり削除されるんだろうと思います。

実行してみます。

C:\Users\takk\Desktop>icacls test.txt /reset
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

さて、アクセスリストはどう変わってるでしょうか。

C:\Users\takk\Desktop>icacls test.txt
test.txt S-1-5-21-282166592-494520350-4258074492-1003:(I)(F)
         NT AUTHORITY\SYSTEM:(I)(F)
         BUILTIN\Administrators:(I)(F)
         DESKTOP-TRO4JUU\takk:(I)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

予想通り元に戻りました。

icacls /verify

ICACLS <名前> /verify [/T] [/C] [/L] [/Q]
    ACL が正規の形式ではないか長さが ACE 数と一致しないすべてのファイルを
    検索します。

また説明が分かりません。ACE数って。。。
アクセスリストエントリって意味らしいです。

とにかく使ってみましょう。

C:\Users\takk\Desktop>echo HELLO > test.txt

C:\Users\takk\Desktop>icacls test.txt /verify
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

何も起こりません。

ACEを全部削除してみます。

C:\Users\takk\Desktop>icacls test.txt /inheritance:r
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

では、もう一回。

C:\Users\takk\Desktop>icacls test.txt /verify
処理ファイル: test.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

ん~。何も変わりません。

もう一つ、ファイルを追加して確認。

C:\Users\takk\Desktop>echo HELLO > test2.txt

C:\Users\takk\Desktop>icacls * /verify
処理ファイル: test.txt
処理ファイル: test2.txt
2 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

よくわかりません。

むむっ、こうなったら。wslでファイル作ってみます。

C:\Users\takk\Desktop>wsl touch test3.txt

C:\Users\takk\Desktop>icacls * /verify
処理ファイル: test.txt
処理ファイル: test2.txt
処理ファイル: test3.txt
3 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

やはり、よくわかりません。

lsの表示を確認してみます。

C:\Users\takk\Desktop>wsl ls -l *
ls: test.txt: Permission denied
-rwxrwxrwx 1 takk takk 8 Jan 29 00:35 test2.txt
-rwxrwxrwx 1 takk takk 0 Jan 29 00:36 test3.txt
---------- 1 takk takk 8 Jan 29 00:24 test.txt

C:\Users\takk\Desktop>

謎が深まる。
本オプションはまだ学習中です。

icacls /T

    /T は、<名前> で指定されたディレクトリ以下のすべての一致するファイルと
        ディレクトリに対してこの処理が実行されることを指定します。

サブディレクトリ以下すべてにicaclsコマンドを適用するようです。

実験用のディレクトリを作ってみます。

wslを使います。

C:\Users\takk\Desktop>wsl
takk@DESKTOP-TRO4JUU:/mnt/c/Users/takk/Desktop$

bashでちょちょいと。

takk@DESKTOP-TRO4JUU:/mnt/c/Users/takk/Desktop$ for i in `seq 10`;do mkdir $i;cd $i;done
takk@DESKTOP-TRO4JUU:/mnt/c/Users/takk/Desktop/1/2/3/4/5/6/7/8/9/10$

wslから抜けると、元のディレクトリに戻るのが非常に便利です。

takk@DESKTOP-TRO4JUU:/mnt/c/Users/takk/Desktop/1/2/3/4/5/6/7/8/9/10$ exit
C:\Users\takk\Desktop>

では、まず、/Tオプションなしで、icaclsを実行します。

C:\Users\takk\Desktop>icacls *
1 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
  NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
  BUILTIN\Administrators:(I)(OI)(CI)(F)
  DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

次は、/Tオプションを指定します。

C:\Users\takk\Desktop>icacls * /T
1 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
  NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
  BUILTIN\Administrators:(I)(OI)(CI)(F)
  DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1\2 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
    NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
    BUILTIN\Administrators:(I)(OI)(CI)(F)
    DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1\2\3 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
      NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
      BUILTIN\Administrators:(I)(OI)(CI)(F)
      DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1\2\3\4 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
        NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
        BUILTIN\Administrators:(I)(OI)(CI)(F)
        DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1\2\3\4\5 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
          NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
          BUILTIN\Administrators:(I)(OI)(CI)(F)
          DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1\2\3\4\5\6 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
            NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
            BUILTIN\Administrators:(I)(OI)(CI)(F)
            DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1\2\3\4\5\6\7 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
              NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
              BUILTIN\Administrators:(I)(OI)(CI)(F)
              DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1\2\3\4\5\6\7\8 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
                NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                BUILTIN\Administrators:(I)(OI)(CI)(F)
                DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1\2\3\4\5\6\7\8\9 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
                  NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                  BUILTIN\Administrators:(I)(OI)(CI)(F)
                  DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1\2\3\4\5\6\7\8\9\10 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
                     NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                     BUILTIN\Administrators:(I)(OI)(CI)(F)
                     DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

10 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

ふむふむ。icaclsが、面白くなってきました。

次は、アクセスリストの追加をします。

C:\Users\takk\Desktop>icacls * /grant testuser2:f /T
処理ファイル: 1
処理ファイル: 1\2
処理ファイル: 1\2\3
処理ファイル: 1\2\3\4
処理ファイル: 1\2\3\4\5
処理ファイル: 1\2\3\4\5\6
処理ファイル: 1\2\3\4\5\6\7
処理ファイル: 1\2\3\4\5\6\7\8
処理ファイル: 1\2\3\4\5\6\7\8\9
処理ファイル: 1\2\3\4\5\6\7\8\9\10
10 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

全ディレクトリにユーザtestuser2にフルコントロールを与えました。

確認してみます。

C:\Users\takk\Desktop>icacls * /T | findstr testuser2
1 DESKTOP-TRO4JUU\testuser2:(F)
1\2 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5\6 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5\6\7 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5\6\7\8 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5\6\7\8\9 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5\6\7\8\9\10 DESKTOP-TRO4JUU\testuser2:(F)

C:\Users\takk\Desktop>

一番上のディレクトリから、testuser2の権限を削除するとどうなるでしょうか。

C:\Users\takk\Desktop>icacls 1 /remove:g testuser2
処理ファイル: 1
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

削除できたか確認してみます。

C:\Users\takk\Desktop>icacls 1
1 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
  NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
  BUILTIN\Administrators:(I)(OI)(CI)(F)
  DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

サブディレクトリはどうなっているでしょうか。

C:\Users\takk\Desktop>icacls * /T | findstr testuser2
1\2 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5\6 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5\6\7 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5\6\7\8 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5\6\7\8\9 DESKTOP-TRO4JUU\testuser2:(F)
1\2\3\4\5\6\7\8\9\10 DESKTOP-TRO4JUU\testuser2:(F)

C:\Users\takk\Desktop>

サブディレクトリにはtestuser2にアクセス権限がある不思議な状態になりました。

もう一本、ディレクトリ階層を作ります。

C:\Users\takk\Desktop>md 11\12\13\14\15\16\17\18\19\20

C:\Users\takk\Desktop>

この二本をシンボリックリンクでくっつけて一本にします。

mklinkは、lnと逆なのは、覚えていますが、その他のオプションがすぐ出てこないです。ヘルプをみます。


C:\Users\takk\Desktop>mklink
シンボリック リンクを作成します。

MKLINK [[/D] | [/H] | [/J]] リンク ターゲット

        /D          ディレクトリのシンボリック リンクを作成します。既定では、
                    ファイルのシンボリック リンクが作成されます。
        /H          シンボリック リンクではなく、ハード リンクを作成します。
        /J          ディレクトリ ジャンクションを作成します。
        リンク      新しいシンボリック リンク名を指定します。
        ターゲット  新しいリンクが参照するパス (相対または絶対)
                    を指定します。

C:\Users\takk\Desktop>

では、一本に結合。

C:\Users\takk\Desktop>mklink /d 1\2\3\4\5\6\7\8\9\10\a C:\Users\takk\Desktop\11
1\2\3\4\5\6\7\8\9\10\a <<===>> C:\Users\takk\Desktop\11 のシンボリック リンクが作成されました

C:\Users\takk\Desktop>

icacls で/Tですべての階層を確認できるでしょうか。

C:\Users\takk\Desktop>icacls 1 /T

~省略~

1\2\3\4\5\6\7\8\9\10\a\12\13\14\15\16\17\18\19\20 S-1-5-21-282166592-494520350-4258074492-1003:(I)(OI)(CI)(F)
                                                  NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                                                  BUILTIN\Administrators:(I)(OI)(CI)(F)
                                                  DESKTOP-TRO4JUU\takk:(I)(OI)(CI)(F)

20 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\takk\Desktop>

20 個とあるので、すべて表示されてますね。
シンボリックリンクも辿ってくれてるようです。

ver バージョン表示

Verコマンドで、Windowsのバージョンが確認できます。

C:\Users\takk2>ver

Microsoft Windows [Version 10.0.17763.107]

C:\Users\takk2>

ええええ!? これだけですか。私が使ってるのは、Windows10のPro何ですが、Proかどうかは分らないってことでしょうか。

ヘルプも見てみます。

C:\Users\takk2>ver /?
Windows のバージョンを表示します。

VER

C:\Users\takk2>

ええええ!? これだけですか。オプションがヘルプしかないなんて。

もう一度確認。

Microsoft Windows [Version 10.0.17763.107]

17763というのがビルドバージョンで、October 2018 Updateのことらしいです。

次は、April 2019 Updateのようです。
※こまったときのwikipedia
https://en.wikipedia.org/wiki/Windows_10_version_history

少しだけ、バージョンが気になるようになりました。

tasklist タスクリスト

Linuxでは、プロセスを確認するのに、psコマンドを使いますが、Windowsだと、プロセスを確認するのは、タスクマネージャしかないと思い込んでましたが、コマンドラインではtasklistが使えます。

C:\Users\takk2>tasklist

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0          8 K
System                           4 Services                   0        532 K
Registry                        88 Services                   0     72,740 K
smss.exe                       296 Services                   0        944 K
csrss.exe                      472 Services                   0      4,216 K
wininit.exe                    560 Services                   0      4,812 K
services.exe                   632 Services                   0      7,672 K

~省略~

ヘルプを見てみます。

C:\Users\takk2>tasklist /?

TASKLIST [/S システム [/U ユーザー名 [/P [パスワード]]]]
         [/M [モジュール] | /SVC | /V] [/FI フィルター] [/FO 形式] [/NH]

説明:
    ローカルまたはリモートのシステムで実行されている
    プロセスの一覧を表示します。

各オプションの説明も書いてあります。

パラメーター一覧:
   /S    システム            接続するリモート システムを指定します。

   /U    [ドメイン\]ユーザー コマンドを実行するユーザー コンテキストを
                             指定します。

   /P    [パスワード]        提供されたユーザー コンテキストのパスワードを
                             指定します。省略された場合は、入力を要求します。

   /M    [モジュール]        指定された EXE/DLL 名を使用しているタスクを
                             すべて表示します。モジュール名が指定されない場合
                             は、読み込まれているモジュールすべてを表示します。

   /SVC                      各プロセスをホストしているサービスを表示します。

   /APPS                   Microsoft Store アプリと関連するプロセスを表示します。

   /V                      詳細なタスク情報を表示します。

   /FI    フィルター       フィルターによって指定された、与えられた条件に一致
                           するタスクを表示します。

   /FO    形式             出力の形式を指定します。
                           有効な値: "TABLE", "LIST", "CSV"。

   /NH                     出力するときに、"カラム ヘッダー"を
                           表示しないように指定します。
                           "TABLE" と "CSV" 形式でのみ有効です。

   /?                      このヘルプ メッセージを表示します。

ひえええ、また覚えにくいオプション名ですが、まだ使ってないので、そう思うのでしょう。

tasklist /v

   /V                      詳細なタスク情報を表示します。

/vをつけてtasklistを実行してみます。

C:\Users\takk2>tasklist /v

イメージ名                     PID セッション名     セッション# メモリ使用量 状態            ユーザー名                                             CPU 時間 ウィンドウ タイトル
========================= ======== ================ =========== ============ =============== ================================================== ============ ========================================================================
System Idle Process              0 Services                   0          8 K Unknown         NT AUTHORITY\SYSTEM                                     5:50:02 N/A
System                           4 Services                   0        532 K Unknown         N/A                                                     0:04:50 N/A
Registry                        88 Services                   0     72,528 K Unknown         N/A                                                     0:00:00 N/A
smss.exe                       296 Services                   0        944 K Unknown         N/A                                                     0:00:00 N/A
csrss.exe                      472 Services                   0      4,140 K Unknown         N/A                                                     0:00:02 N/A
wininit.exe

/vをつけて実行すると、表示完了するまでのものすごく時間がかかっているように思いえます。時間を計測してみます。

/vなし

C:\Users\takk2>powershell -C Measure-Command {tasklist}


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 239
Ticks             : 2398894
TotalDays         : 2.77649768518519E-06
TotalHours        : 6.66359444444444E-05
TotalMinutes      : 0.00399815666666667
TotalSeconds      : 0.2398894
TotalMilliseconds : 239.8894




C:\Users\takk2>

/vあり

C:\Users\takk2>powershell -C Measure-Command {tasklist /v}


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 3
Milliseconds      : 899
Ticks             : 38993725
TotalDays         : 4.51316261574074E-05
TotalHours        : 0.00108315902777778
TotalMinutes      : 0.0649895416666667
TotalSeconds      : 3.8993725
TotalMilliseconds : 3899.3725




C:\Users\takk2>

/vなしは、約0.2秒。/vありは、約3.9秒でした。

tasklist /fi

   /FI    フィルター       フィルターによって指定された、与えられた条件に一致
                           するタスクを表示します。

tasklistを使いこなすには、まずこのオプションではないだろうかと思います。
フィルターの一覧は、tasklist /?で表示されるヘルプの最後の方にあります。

フィルター:
    フィルター名    有効な演算子              有効な値
    -----------     ---------------           --------------------------
    STATUS          eq, ne                    RUNNING | SUSPENDED
                                              NOT RESPONDING | UNKNOWN
    IMAGENAM        eq, ne                    イメージ名
    PID             eq, ne, gt, lt, ge, le    PID 値
    SESSION         eq, ne, gt, lt, ge, le    セッション番号
    SESSIONNAME     eq, ne                    セッション名
    CPUTIME         eq, ne, gt, lt, ge, le    次の形式の CPU 時間
                                              hh:mm:ss
                                              hh - 時間、
                                              mm - 分、ss - 秒
    MEMUSAGE        eq, ne, gt, lt, ge, le    メモリ使用 (KB)
    USERNAME        eq, ne                    [ドメイン\]ユーザーの形式の
                                              ユーザー名
    SERVICES        eq, ne                    サービス名
    WINDOWTITLE     eq, ne                    ウィンドウ タイトル
    MODULES         eq, ne                    DLL 名

注意: リモート コンピューターを照会するときは、"WINDOWTITLE" フィルターと
      "STATUS" フィルターはサポートされません。

使い方は、/fiオプションの後に、”フィルタ名 演算子 値”を指定します。

ユーザ名takk2で絞り込むには、このように指定します。

C:\Users\takk2\Desktop>tasklist /fi "USERNAME eq takk2"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
svchost.exe                    828 Console                    4     13,704 K
sihost.exe                    6888 Console                    4     27,256 K
igfxEM.exe

~省略~

次は、プロセス番号でフィルタしてみます。今cmd.exeは、この2つのプロセスが動作中です。

C:\Users\takk2\Desktop>tasklist | findstr cmd.exe
cmd.exe                       3624 Console                    4      2,528 K
cmd.exe                       7800 Console                    4      4,156 K

C:\Users\takk2\Desktop>

3624のプロセスでフィルタしてみましょう。

C:\Users\takk2\Desktop>tasklist /fi "pid eq 3624"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
cmd.exe                       3624 Console                    4      2,528 K

C:\Users\takk2\Desktop>

フィルタを覚えると、tasklistを使う頻度が増えそうです。

tasklist /M

   /M    [モジュール]        指定された EXE/DLL 名を使用しているタスクを
                             すべて表示します。モジュール名が指定されない場合
                             は、読み込まれているモジュールすべてを表示します。

なんか、ものすごい使えそうなオプションです。

しかし、exeとそれを使うdllを、ぱっと用意できないし、すぐにこのオプションを使うのは、無理かも。。。
よく見ると、モジュールが、括弧付きで説明されてます。省略できるのでは?

tasklistに/Mだけつけて実行してみます。

C:\Users\takk2\Desktop>tasklist /M

イメージ名                     PID モジュール
========================= ======== ============================================
System Idle Process              0 N/A
System                           4 N/A

~省略~

dwm.exe                       1968 N/A
fontdrvhost.exe               7028 N/A
svchost.exe                    828 ntdll.dll, KERNEL32.DLL, KERNELBASE.dll,
                                   sechost.dll, RPCRT4.dll, ucrtbase.dll,
                                   combase.dll, bcryptPrimitives.dll,
                                   kernel.appcore.dll, msvcrt.dll, user32.dll,
                                   win32u.dll, GDI32.dll, gdi32full.dll,
                                   msvcp_win.dll, IMM32.DLL, cdpusersvc.dll,
                                   powrprof.dll, cfgmgr32.dll, cdp.dll,
                                   SHCORE.dll, advapi32.dll, CRYPT32.dll,
                                   MSASN1.dll, PROPSYS.dll, OLEAUT32.dll,
                                   dsreg.dll, cryptsp.dll, msvcp110_win.dll,
                                   WLDP.DLL, WINTRUST.dll, iertutil.dll,
                                   policymanager.dll, bcrypt.dll, clbcatq.dll,
                                   OneCoreCommonProxyStub.dll,
                                   Windows.Security.Authentication.Web.Core.dll
                                   , wintypes.dll, usermgrcli.dll,
                                   SspiCli.dll, vaultcli.dll, WINHTTP.dll,
                                   IPHLPAPI.DLL, NSI.dll, dhcpcsvc6.DLL,
                                   dhcpcsvc.DLL, WS2_32.dll, winsqlite3.dll,
                                   CRYPTBASE.DLL, ncrypt.dll, NTASN1.dll,
                                   ncryptprov.dll, profapi.dll,
                                   Windows.Devices.Radios.dll,
                                   BthRadioMedia.dll, DEVOBJ.dll
sihost.exe                    6888 ntdll.dll, KERNEL32.DLL, KERNELBASE.dll,
                                   msvcrt.dll, combase.dll, ucrtbase.dll,

~省略~

ものすごいたくさん表示されました。
これは使えます。どのdllを使ってるかって、いつも気になってたので。

tasklist /FO

Tasklistの出力の形式は、いろいろ変更できます。

   /FO    形式             出力の形式を指定します。
                           有効な値: "TABLE", "LIST", "CSV"。

使ってみます。
cmd.exeのプロセスでも表示しましょう。

C:\Users\takk2>tasklist | findstr cmd.exe
cmd.exe                       8484 Console                    2      4,276 K

C:\Users\takk2>

まずは、/FO TABLE指定。

C:\Users\takk2>tasklist /fi "pid eq 8484" /fo table

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
cmd.exe                       8484 Console                    2      4,180 K

C:\Users\takk2>

/FO CSV指定。

C:\Users\takk2>tasklist /fi "pid eq 8484" /fo csv
"イメージ名","PID","セッション名","セッション#","メモリ使用量"
"cmd.exe","8484","Console","2","4,012 K"

C:\Users\takk2>

/FO LIST指定。

C:\Users\takk2>tasklist /fi "pid eq 8484" /fo list

イメージ名:          cmd.exe
PID:                 8484
セッション名:        Console
セッション#:         2
メモリ使用量:        4,056 K

C:\Users\takk2>

使えそうです。

tasklist /APPS

ヘルプの説明では、

   /APPS                   Microsoft Store アプリと関連するプロセスを表示します。

Storeアプリは、あまり使ってない気がしますが、確認してみましょう。

C:\Users\takk2>tasklist /apps

イメージ名                                              PID メモリ使用量 パッケージ名
================================================== ======== ============ ==================================================
ShellExperienceHost.exe (App)                          4704     77,168 K Microsoft.Windows.ShellExperienceHost_10.0.17763.1
RuntimeBroker.exe (runtimebroker07f4358a809ac99a64     5180     21,452 K Microsoft.Windows.ShellExperienceHost_10.0.17763.1
SearchUI.exe (CortanaUI)                               5228    131,688 K Microsoft.Windows.Cortana_1.11.5.17763_neutral_neu
RuntimeBroker.exe (runtimebroker07f4358a809ac99a64     5324     17,088 K Microsoft.Windows.Cortana_1.11.5.17763_neutral_neu
MicrosoftEdge.exe (MicrosoftEdge)                      5756     67,200 K Microsoft.MicrosoftEdge_44.17763.1.0_neutral__8wek
SkypeApp.exe (App)                                     6040        952 K Microsoft.SkypeApp_14.38.138.0_x64__kzf8qxf38zg5c
SkypeBackgroundHost.exe (ppleae38af2e007f4358a809a     4304        192 K Microsoft.SkypeApp_14.38.138.0_x64__kzf8qxf38zg5c
YourPhone.exe (App)                                    6164      1,008 K Microsoft.YourPhone_1.0.20094.0_x64__8wekyb3d8bbwe
RuntimeBroker.exe (runtimebroker07f4358a809ac99a64     6284      7,544 K Microsoft.MicrosoftEdge_44.17763.1.0_neutral__8wek
MicrosoftEdgeCP.exe (MicrosoftEdge)                    6404     26,264 K Microsoft.MicrosoftEdge_44.17763.1.0_neutral__8wek
MicrosoftEdgeSH.exe (MicrosoftEdge)                    6480     13,480 K Microsoft.MicrosoftEdge_44.17763.1.0_neutral__8wek
RuntimeBroker.exe (runtimebroker07f4358a809ac99a64     6824      7,292 K Microsoft.YourPhone_1.0.20094.0_x64__8wekyb3d8bbwe
RuntimeBroker.exe (runtimebroker07f4358a809ac99a64     7508     15,296 K Microsoft.SkypeApp_14.38.138.0_x64__kzf8qxf38zg5c
WindowsInternal.ComposableShell.Experiences.TextIn     7224     51,164 K InputApp_1000.17763.1.0_neutral_neutral_cw5n1h2txy
RuntimeBroker.exe (runtimebroker07f4358a809ac99a64     3760      6,108 K InputApp_1000.17763.1.0_neutral_neutral_cw5n1h2txy
WinStore.App.exe (App)                                 7504     29,048 K Microsoft.WindowsStore_11811.1001.18.0_x64__8wekyb
RuntimeBroker.exe (runtimebroker07f4358a809ac99a64     7636      7,228 K Microsoft.WindowsStore_11811.1001.18.0_x64__8wekyb
SystemSettings.exe (microsoft.windows.immersivecon     6432     31,564 K windows.immersivecontrolpanel_10.0.2.1000_neutral_
backgroundTaskHost.exe (App)                            392     26,928 K Microsoft.WindowsStore_11811.1001.18.0_x64__8wekyb
backgroundTaskHost.exe (App)                           4596     25,896 K Microsoft.OneConnect_5.1809.2571.0_x64__8wekyb3d8b
RuntimeBroker.exe (runtimebroker07f4358a809ac99a64      620     21,132 K Microsoft.OneConnect_5.1809.2571.0_x64__8wekyb3d8b

C:\Users\takk2>

意外にたくさんあるんですね。

コメント

タイトルとURLをコピーしました