コマンドプロンプトからPowerShellへの移行

この記事は何か

Windowsコマンドラインシェルとして長らくコマンドプロンプトを利用していたが、エクスプローラの Shift+右クリックメニューで表示されるのがいつのまにか「コマンドウィンドウをここで開く」から「PowerShellウィンドウをここで開く」に変更になっているのに気づいて、「いい加減PowerShellに移行するしかないか」と考えたけれど、ちょっと調べると、PowerShellは複数のバージョンがあったりして困惑しているという人に、PowerShellの知っておくとよいことを案内するものです。

コマンドラインシェル比較

用途は似たようなものなので、何が違うのか簡単に表にします。PowerShell 7.x のみ、別途インストールが必要です。

コマンドラインシェル 実行ファイル フレームワーク サポート期間 プラットホーム 文字コード 起動時間
コマンドプロンプト cmd.exe なし OS依存 Win CP932(ShiftJIS) 瞬時
Windows PowerShell 5.1 powershell.exe .NET Framework OS依存 Win UTF16(BOMあり) 気にならない程度
PowerShell 7.x pwsh.exe .NET Core 及び .NET リリースから1.5~3年 Win, Mac, Linux UTF8(BOMなし) 引っ掛かりを覚える

※ここで文字コードと言っているのは、標準出力で出力した日本語をファイルにリダイレクトしたときに生成されるテキストファイルの文字コードです(バッチファイル、スクリプトファイルを作成する場合のテキストファイルの文字コードでもあります)。また、起動時間は PC のスペックに依存します。

コマンドプロンプトと比較して、PowerShellの大きなメリットは、UNCパス(共有フォルダ)を直接開けることです。コマンドプロンプトだとネットワークドライブの割り当てが必要でした。

また、PowerShell 5.1は、PowerShell ISEという開発環境が利用可能です。拡張子ps1のファイルを右クリック「編集」で起動できます。 「MacLinuxでも使う」、「デフォルトの文字コードはUTF8でないとイヤだ」、「PowerShell 7.x にしかない機能を使いたい」という人以外は、プレインストールされており、サポート期間が長く、起動が早いPowerShell 5.1 を使うのがよいでしょう。

7.x系のサポート期間は、ベースとなる .NET のバージョンに依存しており、だいたいLTS(長期サポートバージョン)は3年、それ以外は1.5年です。7.x系を使う場合は、基本的にLTS-Current(現行の長期サポートバージョン、2023年2月時点ではPowerShell 7.2)をお勧めします。PowerShell 7.2起動時に「最新版があります」と親切に教えてくれますが、最新版の7.3に更新するとサポート期間が短くなります。あと、Microsoftのページのダウンロードリンクは最新版になってしまっており、LTS-Currentを入手しようとすると、GitHubの方に行かないといけないのは注意が必要です。

PowerShellでできること

PowerShellオープンソースで開発されており、レポジトリの GitHub に「Learning PowerShell」という記事があり、この中にあった「Map Book for Experienced Bash users」がよいガイドになっていたのですが、なくなってしまったので、bashコマンドプロンプトに置き換えた対応表を置いておきます。

コマンドプロンプト PowerShell 説明
dir dir, Get-ChildItem ファイルとフォルダーを一覧表示する
tree dir -Recurse, Get-ChildItem -Recurse すべてのファイルとフォルダーを一覧表示する
cd cd, Set-Location ディレクトリを変更する
cd(引数なしで実行) pwd, $pwd, Get-Location 作業ディレクトリを表示
cls cls, clear 画面をクリアする
mkdir New-Item -ItemType Directory 新しいフォルダーを作成する
なし1 New-Item -Path test.txt 新しい空のファイルを作成します
type test1.txt test2.txt Get-Content test1.txt, test2.txt ファイルの内容を表示する
copy ./source.txt ./dest/dest.txt Copy-Item source.txt dest/dest.txt ファイルをコピーする
robocopy /MIR ./source ./dest Copy-Item ./source ./dest -Recurse あるフォルダーから別のフォルダーに再帰的にコピーする
move ./source.txt ./dest/dest.txt Move-Item ./source.txt ./dest/dest.txt ファイルを他のフォルダーに移動する
del test.txt Remove-Item test.txt ファイルを削除する
rmdir /s Remove-Item -Recurse フォルダーを削除する
dir /s build* Get-ChildItem build* -Recurse 「build」で始まるファイルまたはフォルダーを検索します
findstr /s /i sometext *.cs Get-ChildItem -Recurse -Filter *.cs| Select-String -Pattern "sometext" 大文字と小文字を区別せずにファイル内のテキストを再帰的に検索する
curl https://github.com Invoke-RestMethod https://github.com Webからデータを転送する
more test.txt Get-Contents text.txt|Out-Host -Paging 出力を1画面ずつ表示する
fc text1.txt text2.txt Compare-Object (Get-Content text1.txt) (Get-Content text2.txt) ファイルを比較し、相違点を表示する

あと、コマンドプロンプトでは難しかった、ZIP圧縮と解凍が可能になりました。

ヘルプの参照方法

コマンドプロンプトだとヘルプの参照方法はそのコマンドのオプションに「/?」スイッチをつけて実行する形でしたが、PowerShellの場合は Get-Help コマンドレットの引数に調べたいコマンドを指定します。

dir /?
Get-Help Get-ChildItem

ファイル一覧の取得の例

これまたいつの間にか、エクスプローラのファイル選択状態での Shift+右クリックメニューに「パスのコピー」が加わったことにより、必要性が低下しましたが、個人的にはネットワーク調査コマンド以外で、コマンドラインシェルで一番使用頻度が高いのが、ファイル一覧の取得だと思います。ファイル一覧を取得して、クリップボードにコピーする操作は、コマンドプロンプトだと以下でした。

dir /b | clip

PowerShellだと以下になりますが、TABで入力補間ができるので、字面ほどタイプする文字数は増えていません。

Get-Childitem -Name | Set-Clipbord

ネットワークドライブからクイックアクセスへ

PowerShellへの切り替えにより、ネットワークドライブを捨てて、クイックアクセスに一本化できます。 クイックアクセスの利点は次のとおり。

  • 登録と解除が簡単(下記のMSへのリンク参照)
  • 並び替えが簡単(クイックアクセス上で、左クリックでドラッグ&ドロップできます)
  • エクスプローラのトップに表示される

クイック アクセスでのピン留め、削除、カスタマイズ - Microsoft サポート

実行ポリシーの初期値

  • クライアントOS:Restricted(個々のコマンドを許可しますが、スクリプトは許可しません。)
  • サーバーOS:RemoteSigned(インターネットからダウンロードされたスクリプトにデジタル署名を要求。ローカルスクリプトは許可。)

必要に応じて、実行ポリシーについてを参考に変更してください。

参考サイト

更新履歴

  • 2023-02-04 初版作成。
  • 2023-07-21 GitHubの「Learning PowerShell」削除に伴い、対応表を追加。ついでに実行ポリシーの記載を追加。

  1. 「type nul > text.txt」でできるみたいですが、使ったことがある人はほとんどいないと思うので。自分はエクスプローラで「右クリック->新規作成->テキストドキュメント」していました。