Windows 以外のプラットフォームでの PowerShell の相違点
PowerShell は、サポートされているすべてのプラットフォームで機能パリティを提供するよう努めています。 ただし、.NET Core での違いとプラットフォーム固有の違いにより、一部の機能は動作が異なる場合や使用できない場合があります。 Windows 以外のプラットフォームでの PowerShell の相互運用性を向上させるために、その他の変更が行われました。
.NET Framework と .NET Core
Linux と macOS の PowerShell では、Microsoft Windows での完全な .NET Framework のサブセットである .NET Core が使われます。 このため、フレームワークの違いが原因で、Windows で動作するスクリプトが Windows 以外のプラットフォームでは動作しない可能性があります。
.NET Core の変更点の詳細については、.NET Framework から .NET Core への移行に関する破壊的変更に関する記事を参照してください。
Unix の相互運用性に関する一般的な変更
- Unix プラットフォームでのネイティブ コマンドのグロビング サポートを追加しました。 これは、
ls *.txt
のようなネイティブ コマンドでワイルドカードを使用できることを意味します。 more
機能は Linux$PAGER
に対応し、既定でless
に設定されます。- 末尾の円記号は、ネイティブ コマンド引数を処理するときに自動的にエスケープされます。
- Unix プラットフォームで
NoEcho
を受け入れるために ConsoleHost を修正しました。 - Unix では
PATHEXT
環境変数を追加しないでください。 - パッケージには
powershell
man ページが含まれています。
実行ポリシー
PowerShell は、Windows 以外のプラットフォームで実行されている場合、実行ポリシーを無視します。 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、Linux、macOS) で、SSH 経由の PowerShell リモート処理 (PSRP) をサポートしています。 詳細については、PowerShell の SSH リモート処理に関する記事を参照してください。
Just-Enough-Administration (JEA) のサポート
Linux または macOS の PowerShell では、制約付き管理 (JEA) リモート処理エンドポイントを作成できません。
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
を使います。
Windows 以外のプラットフォームに含まれるモジュール
Windows 以外のプラットフォームの場合、PowerShell には次のモジュールが含まれます。
- Microsoft.PowerShell.Archive
- Microsoft.PowerShell.Core
- Microsoft.PowerShell.Host
- Microsoft.PowerShell.Management
- Microsoft.PowerShell.Security
- Microsoft.PowerShell.Utility
- PackageManagement
- PowerShellGet
- PSReadLine
- ThreadJob
PowerShell で一般に使用できるコマンド (コマンドレット) の多くは、Linux または macOS では利用できません。 多くの場合、これらのコマンドはこれらのプラットフォームに適用されません。 たとえば、レジストリやサービスなどの Windows 固有の機能のコマンドは使用できません。 Set-ExecutionPolicy
のような他のコマンドは、存在しますが機能しません。
モジュールとコマンドレット、およびそれらがサポートするプラットフォームの包括的な一覧については、「モジュールとコマンドレットのリリース履歴」を参照してください。
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 以外のプラットフォームで使用できないコマンドレット
一部のコマンドレットが PowerShell から削除されました。 それ以外は、Windows 以外のプラットフォームでは利用できないか、動作が異なる場合があります。 PowerShell から削除されたコマンドレットの包括的な一覧については、「PowerShell から削除されたコマンドレット」を参照してください。
Microsoft.PowerShell.Core
次のコマンドレットは、Linux または macOS では使用できません。
Disable-PSRemoting
Enable-PSRemoting
Connect-PSSession
Disconnect-PSSession
Receive-PSSession
Get-PSSessionCapability
Disable-PSSessionConfiguration
Enable-PSSessionConfiguration
Get-PSSessionConfiguration
Register-PSSessionConfiguration
Set-PSSessionConfiguration
Unregister-PSSessionConfiguration
Test-PSSessionConfigurationFile
Get-Help
の ShowWindow パラメーターは、Windows 以外のプラットフォームでは使用できません。 PowerShell 7.3 では、Linux と macOS 用に Switch-Process
コマンドレットと exec
関数が追加されました。 これらのコマンドは 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 では使用できません。
Rename-Computer
Get-ComputerInfo
Get-HotFix
Clear-RecycleBin
Get-Service
New-Service
Remove-Service
Restart-Service
Resume-Service
Set-Service
Start-Service
Stop-Service
Suspend-Service
Set-TimeZone
次のコマンドレットは、制限付きで使用できます。
Get-Clipboard
- PowerShell 7.0 以降で使用可能Set-Clipboard
- PowerShell 7.0 以降で使用可能Restart-Computer
- Linux および macOS の PowerShell 7.1 以降で使用可能Stop-Computer
- Linux および macOS の PowerShell 7.1 以降で使用可能
Microsoft.PowerShell.Utility コマンドレット
次のコマンドレットは、Linux と macOS では使用できません。
Convert-String
ConvertFrom-String
ConvertFrom-SddlString
Out-GridView
Out-Printer
Show-Command
Linux または macOS では使用できないエイリアス
次の表の一覧で示すエイリアスは、Windows では使用できますが、Windows 以外のプラットフォームでは使用できません。 これらの別名は、別名がそれらのプラットフォームのネイティブ コマンドと競合するため、使用できません。
エイリアス | コマンドレット |
---|---|
ac |
Add-Content |
cat |
Get-Content |
clear |
Clear-Host |
compare |
Compare-Object |
cp |
Copy-Item |
cpp |
Copy-ItemProperty |
diff |
Compare-Object |
kill |
Stop-Process |
ls |
Get-ChildItem |
man |
help |
mount |
New-PSDrive |
mv |
Move-Item |
ps |
Get-Process |
rm |
Remove-Item |
rmdir |
Remove-Item |
sleep |
Start-Sleep |
sort |
Sort-Object |
start |
Start-Process |
tee |
Tee-Object |
write |
Write-Output |
このテーブルには、Windows 以外のプラットフォームに存在しないコマンドレットで使用できない別名は含まれません。
PowerShell Desired State Configuration (DSC)
PowerShell 7.2 以降では、PSDesiredStateConfiguration モジュールは PowerShell から削除され、PowerShell ギャラリーで公開されています。 詳しくは、PowerShell チーム ブログのお知らせをご覧ください。 Linux で DSC を使用する方法の詳細については、Linux 用 DSC の概要に関する記事を参照してください。 DSC v1.1 と v2.x は、macOS ではサポートされていません。 DSC v3 は Windows、Linux、macOS でサポートされていますが、まだ開発の初期段階です。
PowerShell