Windowsコマンド入門記事です。
数ある入門サイトの中からこのブログに辿り着いたということは、Windowsコマンドを応用して圧倒的な生産性を手に入れたいと、Windowsコマンド連携の記事を探し回っているのではないでしょうか。
しかし少し待ってください。コマンドの連携の前にもう一度基礎を確認してみましょう。コマンド単体だけでも十分いろんなことができるのがWindowsコマンドです。
本記事は過去記事のまとめ記事になります。まだまだ更新していきますが、Windowsコマンドのおさらいがてら読んでいただけたら幸いです。
もちろん入門者が読めるようにまだまだ加筆するつもりです。
Contents
- Windowsコマンド 入門編
- cmd.exeを起動
- WindowsコマンドのHello World
- Windowsコマンドが使えると何がお得なの?
- cd ディレクトリ変更
- mkdir/md ディレクトリ作成
- del/erase ファイル削除
- rmdir/rd フォルダやファイル削除
- copy ファイルのコピー
- dir ファイル一覧
- for 繰り返し
- findstr 検索
- type 内容表示
- prompt プロンプト変更
- title ウィンドウのタイトルを設定
- forfiles フォルダ一覧
- xcopy フォルダコピー
- makecab 必要ファイルだけ圧縮
- robocopy コピーの中断再開
- color コンソール色変更
- whoami ユーザ名
- date 日付取得
- mklink シンボリックリンク
- schtasks スケジュール実行
- fsutil FSユーティティ
- net user
- cacls
- icacls
- ver バージョン表示
- tasklist タスクリスト
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>
意外にたくさんあるんですね。
コメント