Windows 以外のプラットフォームでの PowerShell の相違点

PowerShell は、サポートされているすべてのプラットフォームで機能パリティを提供するよう努めています。 ただし、.NET Core の違いとプラットフォーム固有の違いにより、一部の機能の動作が異なる場合や使用できない場合があります。 Windows 以外のプラットフォームでの PowerShell の相互運用性を向上させるために、追加の変更が加えられました。

.NET Framework と .NET Core

Linux と macOS での PowerShell は .NET Core を使用しています。これは、Microsoft Windows の完全な .NET Framework のサブセットです。 このため、フレームワークの違いが原因で、Windows で動作するスクリプトが Windows 以外のプラットフォームでは動作しない場合があります。

.NET Core の変更点の詳細については、.NET Framework から .NET Core への移行に関する破壊的変更に関する記事を参照してください。

Unix の相互運用性に関する一般的な変更

  • Unix プラットフォームでのネイティブ コマンドのグロビング サポートを追加しました。 これは、ls *.txt のようなネイティブ コマンドでワイルドカードを使用できることを意味します。
  • more 機能は Linux $PAGER に対応し、既定で less に設定されます。
  • 末尾の円記号は、ネイティブ コマンド引数を処理するときに自動的にエスケープされます。
  • Unix プラットフォームで NoEcho を受け入れるために ConsoleHost を修正しました。
  • Unix 上では PATHEXT 環境変数を追加しません
  • パッケージに powershell man ページが含まれています

実行ポリシー

Windows 以外のプラットフォームで PowerShell を実行する場合、-ExecutionPolicy パラメーターは無視されます。 Linux と macOS では Get-ExecutionPolicy により [制限なし] が返されます。 Set-ExecutionPolicy は、Linux と macOS では何も行いません。

PowerShell での大文字と小文字の区別

従来、PowerShell では一様に、少数の例外を除いて、大文字と小文字が区別されませんでした。 UNIX 系のオペレーティング システムでは、大部分のファイル システムで大文字と小文字が区別されます。PowerShell はファイル システムの標準に準拠します。

  • PowerShell でファイルを指定する場合、大文字と小文字を正確に区別する必要があります。
  • スクリプトでモジュールを読み込もうとしたときに、モジュール名の大文字と小文字が正しく使用されていないと、モジュールの読み込みは失敗します。 これにより、モジュールを参照する名前と実際のファイル名の大文字と小文字が一致していない場合に既存のスクリプトで問題が発生するおそれがあります。
  • ファイルシステム内の名前では大文字と小文字が区別されますが、ファイル名のタブ補完では大文字と小文字が区別されません。 タブ補完は、大文字と小文字を区別しないマッチングを使用して名前の一覧を循環します。
  • Get-Help は Unix プラットフォームで大文字と小文字を区別しないパターン マッチングをサポートします。
  • Import-Module は、モジュールの名前を判別するためにファイル名を使うときは、大文字と小文字の区別がありません。

Linux と macOS のファイルシステム サポート

  • コマンドレットに指定されるパスがスラッシュに依存しなくなりました (/ と \ の両方がディレクトリの区切り記号として機能)。
  • XDG Base Directory Specification に準拠するようになり、既定では次のように使用されます。
    • Linux/macOS プロファイルのパスは ~/.config/powershell/profile.ps1 にあります。
    • 履歴保存パスは ~/.local/share/powershell/PSReadline/ConsoleHost_history.txt にあります。
    • ユーザー モジュール パスは ~/.local/share/powershell/Modules にあります。
  • Unix では、コロン文字を含むファイルとフォルダーの名前がサポートされます。
  • コンマを含むスクリプトの名前または完全パスがサポートされます。
  • ナビゲーション コマンドレットのワイルドカードの展開を抑制するために -LiteralPath が使用されるタイミングを検出します。
  • *nix ls -R や Windows の DIR /S ネイティブ コマンドのように動作するよう Get-ChildItem を更新しました。 Get-ChildItem は、再帰的検索時に検出されたシンボリック リンクを返し、それらのリンク先のディレクトリは検索しなくなりました。

ファイル拡張子 .PS1

PowerShell スクリプトの末尾は .ps1 である必要があります。これは、スクリプトを読み込んで現在のプロセスで実行する方法を、インタープリターに理解させるためです。 現在のプロセスでスクリプトを実行することは、PowerShell の予期される通常の動作です。 拡張子 .ps1 を持たないスクリプトには、マジック ナンバー #! が追加される場合があります。しかし、これによって、スクリプトは新しい PowerShell インスタンスで実行され、オブジェクトを置き換えるとスクリプトは正常に動作しなくなります。 bash またはもう一方のシェルから PowerShell スクリプトを実行する場合は、この動作が適切である場合があります。

便利な別名の削除

Windows では、ユーザーの利便性のために、Linux コマンドの名前にマッピングするエイリアスのセットが PowerShell に用意されています。 Linux と macOS では、基本的なコマンド lscpmvrmcatmanmountps の "便利な別名" が削除され、パスを指定せずにネイティブ実行可能ファイルを実行できるようになりました。

ログ記録

macOS では、PowerShell はネイティブ os_log API を使用して、Apple の統合ログ システムにログを記録します。 Linux では、PowerShell は、ユビキタス ログ ソリューションである Syslog を使用します。

ジョブ制御

Linux または macOS での PowerShell では、Unix 形式のジョブ制御はサポートされていません。 fgbg コマンドは使用できません。 すべてのプラットフォームで動作する PowerShell ジョブを使用できます。

パイプラインの最後に & を配置すると、パイプラインが PowerShell ジョブとして実行されます。 パイプラインをバックグラウンドで実行すると、ジョブ オブジェクトが返されます。 パイプラインがジョブとして実行されている場合は、すべての *-Job コマンドレットを使ってジョブを管理できます。 パイプラインで使用される変数 (プロセス固有の変数は無視) は、Copy-Item $foo $bar & のみが機能するようにジョブに自動的にコピーされます。 また、ジョブは、ユーザーのホーム ディレクトリではなく、現在のディレクトリで実行されます。

リモート処理のサポート

Unix プラットフォームで WinRM を使用する PowerShell リモート処理 (PSRP) を使用するには、NTLM/Negotiate または基本認証 (HTTPS 経由) が必要です。 macOS 上の PSRP は、HTTPS 経由の基本認証のみをサポートしています。 Kerberos ベースの認証はサポートされていません。

PowerShell は、すべてのプラットフォーム (Windows、macOS、Linux) で、SSH 経由の PowerShell リモート処理 (PSRP) をサポートしています。 詳細については、PowerShell の SSH リモート処理に関する記事を参照してください。

Just-Enough-Administration (JEA) のサポート

制約付き管理 (JEA) リモート処理エンドポイントを作成する機能は、Linux または macOS 上の PowerShell では利用できません。

sudoexec、PowerShell

PowerShell では、ほとんどのコマンドが (Python や Ruby のように) メモリ内で実行されるため、PowerShell の組み込み要素で sudo を直接使うことはできません。pwsh は sudo から実行できます。 sudo を使用して PowerShell 内から PowerShell コマンドレットを実行する必要がある場合は (例: sudo Set-Date 8/18/2016)、sudo pwsh Set-Date 8/18/2016 のようにします。

なくなったコマンドレット

通常 PowerShell で使用できるコマンド (コマンドレット) の多くは、Linux または macOS では利用できません。 多くの場合、このようなコマンドはこれらのプラットフォーム上では役に立ちません (例: レジストリのような Windows 固有の機能)。 サービス コントロール コマンドのようなその他のコマンドは、存在しますが機能しません。 これらの問題は今後のリリースで修正され、バグのあるコマンドレットが修正され、新しいコマンドレットが時間と共に追加される可能性があります。

モジュールとコマンドレット、およびそれらがサポートするプラットフォームの包括的な一覧については、「モジュールとコマンドレットのリリース履歴」を参照してください。

PowerShell に付属しなくなったモジュール

互換性に関するさまざまな理由から、次のモジュールは PowerShell に含まれなくなりました。

  • ISE
  • Microsoft.PowerShell.LocalAccounts
  • Microsoft.PowerShell.ODataUtils
  • Microsoft.PowerShell.Operation.Validation
  • PSScheduledJob
  • PSWorkflow
  • PSWorkflowUtility

次の Windows 固有のモジュールは、Linux または macOS の PowerShell には含まれていません。

  • CimCmdlets
  • Microsoft.PowerShell.Diagnostics
  • Microsoft.WSMan.Management
  • PSDiagnostics

Windows 以外のプラットフォームで使用できないコマンドレット

Windows 以外のプラットフォームの場合、PowerShell には次のモジュールが含まれます。

  • Microsoft.PowerShell.Archive
  • Microsoft.PowerShell.Core
  • Microsoft.PowerShell.Host
  • Microsoft.PowerShell.Management
  • Microsoft.PowerShell.Security
  • Microsoft.PowerShell.Utility
  • PackageManagement
  • PowerShellGet
  • PSDesiredStateConfiguration
  • PSReadLine
  • ThreadJob

ただし、一部のコマンドレットは PowerShell から削除されており、その他は Windows 以外のプラットフォームでは使用できないか、動作が異なる場合があります。 PowerShell から削除されたコマンドレットの包括的な一覧については、「PowerShell から削除されたコマンドレット」を参照してください。

Microsoft.PowerShell.Core

Get-HelpShowWindow パラメーターは、Windows 以外のプラットフォームでは使用できません。

Microsoft.PowerShell.Security コマンドレット

次のコマンドレットは、Linux または macOS では使用できません。

  • Get-Acl
  • Set-Acl
  • Get-AuthenticodeSignature
  • Set-AuthenticodeSignature
  • New-FileCatalog
  • Test-FileCatalog

これらのコマンドレットは、PowerShell 7.1 以降でのみ使用できます。

  • Get-CmsMessage
  • Protect-CmsMessage
  • Unprotect-CmsMessage

Microsoft.PowerShell.Management コマンドレット

次のコマンドレットは、Linux と macOS では使用できません。

  • Clear-RecycleBin
  • Get-HotFix

次のコマンドレットは、制限付きで使用できます。

Get-Clipboard - Linux で使用できますが、macOS ではサポートされていません Set-Clipboard - PowerShell 7.0 以降で使用できます Restart-Computer - PowerShell 7.1 以降の Linux と macOS で使用できます Stop-Computer - PowerShell 7.1 以降の Linux と macOS で使用できます

Microsoft.PowerShell.Utility コマンドレット

次のコマンドレットは、Linux と macOS では使用できません。

  • Convert-String
  • ConvertFrom-String
  • Out-GridView
  • Out-Printer
  • Show-Command

Linux または macOS では使用できないエイリアス

次の表の一覧で示すエイリアスは、Windows では使用できますが、Windows 以外のプラットフォームでは使用できません。 これらのエイリアスは、ターゲット コマンドレットが使用できないため、またはエイリアスがこれらのプラットフォーム上のネイティブ コマンドと競合するため、使用できません。

エイリアス コマンドレット
ac Add-Content
cat Get-Content
clear Clear-Host
cnsn Connect-PSSession
compare Compare-Object
cp Copy-Item
cpp Copy-ItemProperty
diff Compare-Object
dnsn Disconnect-PSSession
gsv Get-Service
kill Stop-Process
ls Get-ChildItem
man help
mount New-PSDrive
mv Move-Item
ogv Out-GridView
ps Get-Process
rm Remove-Item
rmdir Remove-Item
sasv Start-Service
shcm Show-Command
sleep Start-Sleep
sort Sort-Object
spsv Stop-Service
start Start-Process
tee Tee-Object
write Write-Output

PowerShell Desired State Configuration (DSC)

PowerShell 6.0 以降では、多くのコマンドレットが PSDesiredStateConfiguration モジュールから削除されました。 Windows 以外のプラットフォームでの DSC のサポートは限られており、ほとんどが試験段階です。 Invoke-DscResource コマンドレットは、PowerShell 7.0 の試験的な機能として復元されました。

DSC は、macOS ではサポートされていません。

Linux で DSC を使用する方法の詳細については、Linux 用 DSC の概要に関する記事を参照してください。

PowerShell 7.2 以降では、PSDesiredStateConfiguration モジュールが PowerShell から削除されており、PowerShell ギャラリーに発行されます。 詳細については、PowerShell チーム ブログのお知らせを参照してください。