PowerShell 7.1 Preview 3新機能 - PSDriveと「~」のネイティブコマンド対応

【連載】

PowerShell Core入門 - 基本コマンドの使い方

【第100回】PowerShell 7.1 Preview 3新機能 - PSDriveと「~」のネイティブコマンド対応

[2020/05/25 07:00]後藤大地 ブックマーク ブックマーク

PowerShell 7.1 Preview 3登場

Microsoftは2020年5月19日(米国時間)、「PowerShell Team May 2020 Update | PowerShell」において、次期PowerShell 7.1へ向けた3つ目のプレビュー版となる「PowerShell 7.1 Preview 3」の公開を伝えた。このプレビュー版から.NET 5のプレビュー版と同期して公開が行われるようになる。PowerShellが.NETと強く連動していることはこれまで何度も取り上げてきたが、今後は.NETのプレビュー版とPowerShellのプレビュー版が同期してリリースされることになる。これにより、.NETの新機能をより迅速にPowerShellに反映できるようになるものと見られる。

PowerShell 7.1 Preview 3には、「PSDrive」に関する実験機能が取り込まれた。同機能はユーザーの使い勝手を大きく向上させることになる。今回はこのPSDrive機能について取り上げる。

PowerShell 7.0で導入されたPSDriveの問題点

PowerShell 7.0にはPSDriveと呼ばれる仮想ドライブ機能が導入された。ファイルシステムパスやリソースプロバイダを絶対パスではなく仮想パスで指定できるというものだ。PowerShell 7.0に導入されたPSDriveは次のようにして確認することができる。

PowerShell 7.0のPSDrive

上記の環境だと「Temp:」は「C:\Users\daich\AppData\Local\Temp」を意味する。「Temp:」は一時ファイルなどを作成する場合に使われる仮想ドライブで、自分で明示的にディレクトリを指定せずとも環境に応じたパスに置き換わる。例えば、macOSのPowerShell 7.0で「Temp:」を調べると、次のように「/var/folders/2h/1b8rfbs95pl0f8mpj1qj3bxm0000gn/T」が使われていることがわかる。「Temp:」はその環境に則したパスに置き換わるのだ。

macOSのPowerShell 7.0における「Temp:」

PSDriveは便利な機能だが、PowerShell 7.0のコマンドレットや関数に対しては機能するものの、ネイティブコマンドに対しては機能しないという問題がある。PowerShell 7はコマンドレットとネイティブコマンドのシームレスな連携を目指しているが、PSDriveに関しては7.0の段階ではうまくいっていなかった。今回、PowerShell 7.1 Preview 3でこの問題の解決方法が取り組まれたことになる。

実験的機能「PSNativePSPathResolution」

PowerShell 7.1 Preview 3に導入された解決方法は実験的機能に位置付けられており、管理者権限で動作する場合に限り機能が有効になる仕組みになっている。管理者権限でWindows Terminalを実行し、そこからPowerShell 7.1 Preview 3を起動しよう。次のスクリーンショットのように、Get-ExperimentalFeatureコマンドレットを実行してPSNativePSPathResolutionの機能が「True」になっていればこの機能を試すことができる。

管理者権限で動作していればPSNativePSPathResolutionが「True」になる

PSDriveがネイティブコマンドに対応

では、実際にどのように変わったのかを見てみよう。次のスクリーンショットはPowerShell 7.0で実行したものだ。

Temp:の動作サンプル - PowerShell 7.0

「temp:/tmp.xxx」はdirに対しては「C:\Users\daich\AppData\Local\Temp\tmp.xxx」として解釈されていることがわかる。PSDriveが機能しているためだ。

しかし、同じパスをメモ帳(notepad.ext)に渡すと、その指定は間違っているというエラーが表示される。PSDriveがただの文字列として解釈されたためだ。dirはコマンドレットのエイリアスなのでPSDriveが機能し、notepadはネイティブコマンドなのでPSDriveが機能しないためである。

PowerShell 7.0ではPSDriveはネイティブコマンドに対しては機能しない

これをPowerShell 7.1 Preview 3で実行すると次のようになる。

Temp:の動作サンプル - PowerShell 7.1 Preview 3

PowerShell 7.1 Preview 3から実行したメモ帳の出力が変わっている。「C:\Users\daich\AppData\Local\Temp\tmp.xxx」というパスが渡っており、ファイルが存在していないので新規作成するかどうか、というメッセージになっている。

PowerShell 7.1 Preview 1ではPSDriveがネイティブコマンドに対しても機能する

これはPowerShell 7.1 Preview 3が、ネイティブコマンドにパスを渡す前にPSDriveを展開するようになったからである。ネイティブコマンドに渡す前にPSDriveが展開されるので、ネイティブコマンドに対しても機能するようになったわけだ。

逆にこの動作をキャンセルするにはPSDriveをシングルクォーテーションで囲めばよい。シングルクォーテーションで囲まれた文字列はただの文字列として扱われるため、PSDriveの展開は行われなくなる。

特に一時ファイルを作成するために使う「Temp:」は結構頻繁に利用するものだ。この機能がコマンドレットに対してもネイティブコマンドに対しても同じように機能するようになったことで、いちいちコマンドレットとネイティブコマンドを意識して書き方を変える必要がなくなった。

ホームディレクトリ「~」に対応

似たような機能として、「~」に対しても同じような変更が加えられた。恐らくこちらのほうがより便利だ。例えば、次のスクリーンショットはPowerShell 7.0で実行したものである。

PowerShell 7.0では「~」がホームディレクトリとして理解されるのはコマンドレットや関数のみ

PowerShell 7.0ではネイティブコマンドに対する「~」はホームディレクトリとしては解釈されない

コマンドレットは~をホームディレクトリと解釈して動作するのだが、ネイティブコマンドは「~」をホームディレクトリとしては解釈してくれない。

これがPowerShell 7.1 Preview 3では、次のようにコマンドレットに対してもネイティブコマンドに対しても「~」がホームディレクトリとして解釈されることを確認できる。

PowerShell 7.1 Preview 3でのサンプル

PowerShell 7.1 Preview 3ではネイティブコマンドに対する「~」もホームディレクトリとして解釈される

「~」の動作もPSDriveと同じだ。ネイティブコマンドに渡す前にPowerShell 7.1 Preview 3が~をホームディレクトリに置き換えている。

「~」はUNIX系のシェルではホームディレクトリを指す方法として広く使われている。PowerShell 7.0ではコマンドレットとネイティブコマンドで「~」の使用を変更しないといけなかったので、ストレスの元になっていた。実験的機能としてだが、PowerShell 7.1 Preview 3ではこの点が改善された。PowerShell 7.1の正式版からは7.0よりもストレスが減ることになりそうだ。

MicrosoftはWindows TerminalとPowerShell 7を開発者の新しいプラットフォームの1つにしようとしている。その場合、コマンドレットとネイティブコマンドのシームレスな統合は必須だ。今後、さらにこの手の改善が取り込まれるものと見られる。

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

もっと知りたい!こちらもオススメ

【連載】RPA入門 - ツールで学ぶ活用シーン

【連載】RPA入門 - ツールで学ぶ活用シーン

AIには、ルールベース、機械学習、深層学習(ディープラーニング)の3つのレベルがあり、レベルが上がるに連れてより高度な人工知能を実現しますが、AIのスピンオフという位置付けで、Digital Labor(仮想知的労働者)によるホワイトカラー業務の自動化を実現するRPAが注目されています。

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で IT Search+ の人気記事をお届けします
注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
[解説動画] 個人の業務効率化術 - 短時間集中はこうして作る
ミッションステートメント
教えてカナコさん! これならわかるAI入門
AWSではじめる機械学習 ~サービスを知り、実装を学ぶ~
対話システムをつくろう! Python超入門
Kubernetes入門
SAFeでつくる「DXに強い組織」~企業の課題を解決する13のアプローチ~
PowerShell Core入門
AWSで作るマイクロサービス
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

会員登録(無料)

ページの先頭に戻る