コマンドプロンプトの、たぶんあまり知られていないテクニック

Windows のコマンドプロンプトを便利に使うための、たぶんあまり知られていないテクニックを 5 つ紹介します。

動作確認環境

  • Windows 10 Home 21H1, 64bit

ファイルのフルパス名を表示する

dir コマンドは、通常、狭義のファイル名(ベースネーム+拡張子)を表示します。
たとえば、Windows のシステムディレクトリにて「dir kernel*.dll」と入力すると、次のように表示されます。

C:\Windows\System32>dir kernel*.dll
......
2020/12/13  12:02            60,464 kernel.appcore.dll
2021/09/12  18:15           770,144 kernel32.dll
2021/09/12  18:16         2,923,944 KernelBase.dll
               3 個のファイル           3,754,552 バイト
......

この dir コマンドに「/s /b」オプションを付加すると、フルパス名が表示されます。

C:\Windows\System32>dir /s /b kernel*.dll

C:\Windows\System32\kernel.appcore.dll
C:\Windows\System32\kernel32.dll
C:\Windows\System32\KernelBase.dll
C:\Windows\System32\DiagSvcs\KernelTraceControl.dll

「/s」は「サブディレクトリも検索する」、「/b」は「ファイル名のみ表示する」の意味ですが、この 2 つを同時に指定するとフルパス名が表示されます。

フルパス名を表示したいがサブディレクトリは検索したくない場合は、「where .:」が使えます。

C:\Windows\System32>where .:kernel*.dll

C:\Windows\System32\kernel.appcore.dll
C:\Windows\System32\kernel32.dll
C:\Windows\System32\KernelBase.dll

where コマンドは検索結果をフルパス名で表示します。また、where に続く「.:」は「カレントディレクトリから検索」を意味します。したがって、「where .:検索パターン」を実行すると、カレントディレクトリにある検索パターンに一致するファイルがフルパス名で表示されます。

フルパス名が示すファイルの場所に移動する

あるファイルのフルパス名がクリップボードに入っている、そして、そのファイルがある場所に移動したい、という状況になることがあります。

そんなとき、「cd 」と入力し、右クリックなどでフルパス名を貼り付け、バックスペースでファイル名を削除して [Enter] としてもいいですが、

C:\>cd C:\Program Files\Internet Explorer\iexplore.exe

                                     ↓ 「\iexplorer.exe」を削除

C:\>cd C:\Program Files\Internet Explorer
C:\Program Files\Internet Explorer>

フルパス名の末尾に「\..」を追加して [Enter] とする方法もあります。

C:\>cd C:\Program Files\Internet Explorer\iexplore.exe

                                     ↓ 「\..」を追加

C:\>cd C:\Program Files\Internet Explorer\iexplore.exe\..
C:\Program Files\Internet Explorer>

バックスペースでファイル名を消す方法では、キーを押す回数が多くなったり、消し過ぎたり消し足りなかったりしがちなので、「\..」の固定 3 文字を付加する方法は結構便利です。いわゆるディレクトリトラバーサルです。

カレントディレクトリをパスに追加する

コマンドプロンプトで作業中に、一時的にカレントディレクトリを検索パスに追加したくなることがあります。
そんなとき、次のコマンドを入力すれば、現在の検索パスにカレントディレクトリが追加されます。

C:\>path %path%;%cd%

環境変数 path には現在のパスが、環境変数 cd にはカレントディレクトリが格納されているからです。

環境変数 path の変化の様子を以下に示します。

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64>path
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\Sys
<中略>
ppData\Roaming\npm;;C:\Program Files (x86)\Windows Kits\10\Debuggers\x86

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64>echo %cd%
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64>path %path%;%cd%

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64>path
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\Sys
<中略>
ppData\Roaming\npm;;C:\Program Files (x86)\Windows Kits\10\Debuggers\x86;C:
\Program Files (x86)\Windows Kits\10\Debuggers\x64

検索パスを改行で区切って表示する

環境変数 path には多数のパスが記号「;」で連結されており、どこが切れ目なのか判然としません。

C:\>path

PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\Sys
tem32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files
\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Pro
gram Files (x86)\EmEditor;C:\Program Files\dotnet\;C:\Program Files (x86)\d
otnet\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\
;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Pro
gram Files\Git\cmd;C:\Program Files\nodejs\;C:\Program Files\Docker\Docker\
resources\bin;C:\ProgramData\DockerDesktop\version-bin;C:\Tool;C:\Users\usr
\AppData\Local\Microsoft\WindowsApps;C:\Program Files (x86)\Windows Kits\10
\Debuggers\x86;C:\Users\usr\AppData\Local\Programs\Microsoft VS Code\bin;C:
\Users\usr\.dotnet\tools;C:\Users\usr\AppData\Local\bin\NASM;C:\Users\usr\A
ppData\Roaming\npm;C:\Program Files (x86)\Windows Kits\10\Debuggers\x86;C:\
Program Files (x86)\Windows Kits\10\Debuggers\x64

そんなとき、次の 2 つのコマンドを実行すると、パス名ごとに改行が入り見やすく表示されます。

C:\>set a=%path:;=^&echo.%
C:\>echo %a%

C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
C:\WINDOWS\System32\WindowsPowerShell\v1.0\
C:\WINDOWS\System32\OpenSSH\
C:\Program Files\Intel\WiFi\bin\
C:\Program Files\Common Files\Intel\WirelessCommon\
C:\Program Files (x86)\EmEditor
C:\Program Files\dotnet\
C:\Program Files (x86)\dotnet\
C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\
C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\
C:\Program Files\Git\cmd
C:\Program Files\nodejs\
C:\Program Files\Docker\Docker\resources\bin
C:\ProgramData\DockerDesktop\version-bin
C:\Tool
C:\Users\usr\AppData\Local\Microsoft\WindowsApps
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86
C:\Users\usr\AppData\Local\Programs\Microsoft VS Code\bin
C:\Users\usr\.dotnet\tools
C:\Users\usr\AppData\Local\bin\NASM
C:\Users\usr\AppData\Roaming\npm
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

「set a=%path:;=^&echo.%」で、環境変数 path 内の記号「;」を「&echo.」に置換し(「&」の直前の「^」はエスケープの役割)、環境変数 a にセットしています。次の「echo %a%」で、「echo 」+「環境変数 a の値」を実行しています。

たとえば、環境変数 path の値が「Hello;World;Japan」だった場合、最初のコマンドで「Hello&echo.World&echo.Japan」が環境変数 a にセットされます。そして、次のコマンドで「echo Hello&echo.World&echo.Japan」が実行されます。

この方法は、「;」で区切られている任意の文字列、たとえば Visual C++ で使う環境変数 include の表示にも利用できます。

C:\>set a=%include:;=^&echo.%
C:\>echo %a%

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\ATLMFC\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\include
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\shared
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\winrt
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\cppwinrt

一度実行したコマンドをマクロに登録する

過去に実行したコマンドを再実行したい場合、[↑] キーで履歴をたどったり、[F7] キーで履歴を表示したりしてもいいですが、マクロに登録しておくと履歴から探すことなく指定のコマンドで何度でも再実行できます。

たとえば、最初に「doskey m1=^」[Enter] と入力します。

C:\>doskey m1=^
More?

ここでは「macro1」の意味で「m1」としましたが、ほかの名前も使えます。末尾の「^」は「続きがあります」という意味です。

続いて、[↑] キーを必要な回数押してマクロとして登録したいコマンドを表示し、[Enter] キーを押します。

c:\>doskey m1=^
More? "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" c:\windows\notepad.exe

c:\>

これでマクロ「m1」が登録されました。以後は「m1」[Enter] で、登録したコマンドが実行されます。

このマクロは一時的なもので、コマンドプロンプトを閉じると消失します。永続性が必要な場合は、「doskey m1=^」の代わりに「copy con m1.bat」と入力し、最後に [Ctrl]+[Z], [Enter] キーを押してください。