次の方法で共有


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 にあります。
  • 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、Linux、macOS) で、SSH 経由の PowerShell リモート処理 (PSRP) をサポートしています。 詳細については、PowerShell の SSH リモート処理に関する記事を参照してください。

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

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

sudoexec、PowerShell

PowerShell では、ほとんどのコマンドがメモリ内で実行されるため (Python や Ruby のように)、PowerShell の組み込み要素と共に sudo を直接使用することはできません。pwshsudo から実行できます。 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-HelpShowWindow パラメーターは、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 でサポートされていますが、まだ開発の初期段階です。