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
にあります。
- Linux/macOS プロファイルのパスは
- 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 では、基本的なコマンド ls
、cp
、mv
、rm
、cat
、man
、mount
、ps
の "便利な別名" が削除され、パスを指定せずにネイティブ実行可能ファイルを実行できるようになりました。
ログ記録
macOS では、PowerShell はネイティブ os_log
API を使用して、Apple の統合ログ システムにログを記録します。
Linux では、PowerShell は、ユビキタス ログ ソリューションである Syslog を使用します。
ジョブ制御
Linux または macOS での PowerShell では、Unix 形式のジョブ制御はサポートされていません。 fg
と bg
コマンドは使用できません。 すべてのプラットフォームで動作する 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 では利用できません。
sudo
、exec
、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-Help
の ShowWindow パラメーターは、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 チーム ブログのお知らせを参照してください。
PowerShell
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示