about_Case-Sensitivity

簡単な説明

PowerShell は、大文字と小文字を保持しながら、可能な限り大文字と小文字を区別しません。

長い説明

一般的な原則として、PowerShell は可能な限り大文字と小文字を区別しませんが、大文字と小文字は保持され、基になる OS は中断されません。

Windows ベースのシステムでは、ほとんどの操作で大文字と小文字が区別されません。 ただし、Windows 以外のシステムでは、ほとんどの操作で大文字と小文字が区別されます。特にファイル システムと環境変数へのアクセスでは大文字と小文字が区別されます。

PowerShell は、次の領域のすべてのシステムで大文字と小文字が区別されません。

  • 変数名
  • 演算子名
  • 非ディクショナリ メンバー アクセス
  • PowerShell コマンドとエイリアスのコマンド検出。 これにより、ExternalScript コマンドと Application コマンドは除外されます。
  • パラメーター名とエイリアス
  • PowerShell 言語キーワード
  • using namespace ステートメント
  • 型リテラル
  • #Requires ステートメント
  • コメントベースのヘルプ キーワード
  • PSProvider の名前
  • PSDrive 名
  • スコープ修飾子

特殊なケース

  • モジュール名では大文字と小文字が区別されません (例外あり)

    モジュールの は、純粋に PowerShell の概念であり、大文字と小文字を区別せずに扱われます。 ただし、フォルダー名への強力なマッピングがある場合には、ベースとなるオペレーティング システムでは大文字と小文字が区別される可能性があります。 大文字と小文字を区別しない同じ名前の 2 つのモジュールをインポートする場合、同じ名前の 2 つのモジュールを異なるパスからインポートする場合と同じ動作になります。

    モジュールの名前は、インポートされたケースを使用してセッション状態に格納されます。 セッション状態に格納されている名前は、新しいヘルプ ファイルを探すときに Update-Help によって使用されます。 Microsoft のヘルプ ファイルを提供する Web サービスでは、大文字と小文字が区別されるファイル システムが使用されます。 モジュールのインポート名の大文字小文字が一致しない場合、Update-Help はヘルプファイルを見つけられず、エラーを報告します。

  • PS プロバイダー:

    FileSystemプロバイダーとEnvironment プロバイダーは、Windows 以外のシステムでは大文字と小文字が区別されます。 一般に、パスまたは環境変数を含む操作は、このようなシステムでは大文字と小文字が区別されます。

    ただし、システムに関係なく、プロバイダー コマンドレットによるワイルドカード照合では大文字と小文字が区別されません。

    PS /home/user01> New-Item -Path Temp:foo.txt -Force
    
        Directory: /tmp
    
    UnixMode      User Group      LastWriteTime         Size Name
    --------      ---- -----      -------------         ---- ----
    -rw-r--r--  user01 user01    1/6/2026 10:53            0 foo.txt
    
    PS /home/user01> (Get-Item -Path Temp:FOO.txt).Name
    Get-Item: Cannot find path 'Temp:/FOO.txt' because it does not exist.
    
    PS /home/user01> (Get-Item -Path Temp:F[O]*.txt).Name
    foo.txt
    
    PS /home/user01> (Get-Item -Path Env:hOM[E]).Name
    HOME
    
  • パラメーター セット名では、大文字と小文字が区別されます。

    DefaultParameterSetNameケースは、ParameterSetNameと同じである必要があります。

  • .NET メソッドでは、多くの場合、既定で大文字と小文字が区別される動作が示されます。

    たとえば、次のようになります。

    • 次のような一般的な PowerShell 演算子に対して同等の .NET メソッド (明示的なオプトインなし)
      • Array.Contains()String.Contains()String.Replace()Regex.Match()Regex.Replace()
    • 反射;メンバー名は、正しい大文字と小文字を使用する必要があります。
    • リテラル以外のディクショナリのインスタンス化。 例えば:
      • [hashtable]::new() には大文字と小文字が区別されますが、ハッシュテーブルリテラル @{} では大文字と小文字が区別されません。
      • [ordered]::new() には大文字と小文字が区別されますが、 [ordered] @{} には大文字と小文字が区別されません。 [ordered]アクセラレータは、PowerShell v5.1 以前では使用できません。
    • Enum.Parse()を明示的に呼び出すことは既定では大文字と小文字が区別されますが、PowerShell では通常、大文字と小文字を区別しない方法で列挙型が処理されます。
  • -Unique コマンドレット:

  • Compare-Object は既定では大文字と小文字が区別されませんが、 -CaseSensitive スイッチがあります。 [char]型の比較では、既定では大文字と小文字が区別されます。 既定では、文字列比較では大文字と小文字が区別されません。

    # Compare strings - Equal (no output)
    Compare-object -ReferenceObject a            -DifferenceObject A
    # Compare chars - Different (output)
    Compare-object -ReferenceObject ([char] 'a') -DifferenceObject ([char] 'A')
    
  • ConvertFrom-Json -AsHashtable:

    • -AsHashtable PS v6 に追加されました。 PS v7.3 では、このパラメーターが指定されたときに JSON キーを大文字と小文字が区別されるように変更されました。
      • パラメーターを使用すると、 Management.Automation.OrderedHashtable 型のオブジェクトが生成されます。このオブジェクトには大文字と小文字が区別されます。
      • パラメーターがない場合、JSON キーは大文字と小文字を区別しないものとして扱われます。 出力はカスタム オブジェクトです。最後の大文字と小文字を区別しないキーが優先されます。
    • https://github.com/PowerShell/PowerShell/issues/19928
  • Group-Object:

    • 既定では大文字と小文字は区別されませんが、 -CaseSensitive スイッチがあります。

    • Windows PowerShell v5.1 では、 -CaseSensitive-AsHashtable では、大文字と小文字を区別しないハッシュテーブルが生成されます。 キーが重複するとエラーが発生します。

      [pscustomobject] @{ Foo = 'Bar' }, [pscustomobject] @{ Foo = 'bar' } |
          Group-Object -Property Foo -CaseSensitive -AsHashtable
      
      Group-Object : The objects grouped by this property cannot be expanded
      because there is a key duplication. Provide a valid value for the
      property, and then try again.
      At line:2 char:11
      +           Group-Object -Property Foo -CaseSensitive -AsHashtable
      +           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          + CategoryInfo          : InvalidArgument: (:) [Group-Object], Exception
          + FullyQualifiedErrorId : The objects grouped by this property
      cannot be expanded because there is a key duplication. Provide a valid
      value for the property, and then try again.,Microsoft.PowerShell.Comman
      ds.GroupObjectCommand
      
    • PowerShell v7 以降では、 -CaseSensitive-AsHashtable では、大文字と小文字が区別されるハッシュテーブルが生成されます。 キーが重複してもエラーは発生しません。

      [pscustomobject] @{ Foo = 'Bar' }, [pscustomobject] @{ Foo = 'bar' } |
          Group-Object -Property Foo -CaseSensitive -AsHashtable
      
      Name                           Value
      ----                           -----
      Bar                            {@{Foo=Bar}}
      bar                            {@{Foo=bar}}
      
  • Select-String:

    • 既定では大文字と小文字は区別されませんが、 -CaseSensitive スイッチがあります。
  • Get-Command コマンドの検出/呼び出し:

    • 大文字と小文字を区別するファイル システムでは、 ExternalScript コマンドと Application コマンドの検出と呼び出しでは大文字と小文字が区別されます。
    • Get-Command これらの型とのワイルドカード マッチングも大文字と小文字が区別されます。
    • その他のすべての CommandTypes では、大文字と小文字が区別されません。
  • 比較演算子:

    • 既定では、演算子では大文字と小文字が区別されません。

    • -c* 演算子では大文字と小文字が区別されます。

    • -i* 演算子では大文字と小文字が区別されません。

    • -replace / -ireplace既定では 大文字と小文字が区別されません。ただし、 名前付きキャプチャ グループでは大文字と小文字が区別されます。

      'Bar' -replace '(?<a>a)', '${a}${a}'
      # Baar
      
      'Bar' -replace '(?<a>a)', '${A}${A}'
      # B${A}${A}r
      
  • -split 演算子:

    • -split-isplit では大文字と小文字が区別されません。

    • -csplitは、IgnoreCase オプションが指定されていない限り、大文字と小文字が区別されます。

      'Bar' -csplit 'A', 0
      # Bar
      
      'Bar' -csplit 'A', 0, 'IgnoreCase'
      # B
      # r
      
  • タブ補完:

    • 大文字と小文字を区別するファイル システムでは、タブ補完と glob の両方で大文字と小文字が区別されません。 たとえば、linux で./Foo.txtするには、TabExpansion2 -inputScript ./fooが完了します。
  • using ステートメント:

    • 大文字と小文字が区別されるファイル システムでは、パスが指定されている場合、 using moduleusing assembly では大文字と小文字が区別されます。
    • using module モジュール名だけで大文字と小文字は区別されません。
    • using namespace は常に大文字と小文字が区別されません。
  • 特殊文字:

    • `nなどのエスケープ シーケンスでは、大文字と小文字が区別されます。

こちらも参照ください