6

以下のコードが返されるのはなぜ$nullですか?一意の値だけを保存しようとしています。

$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique 
4

3 に答える 3

12

短い答え:

すべての一意のパスを取得するには、スイッチにパイプ$DailyPathsToDeleteSelect-Objectて設定する必要がありますUnique

$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique

長い答え:

1.なぜ機能しないのか

スクリプトを実行した後は、(スクリプトの2行目で)パラメーターにバインドされているため、 $DailyPathsToDeleteequalsになります。コマンドレットのパラメーターが指定されていなかったため、の呼び出しの結果はです。$null$DailyPathsToDeletePropertyInputObjectSelect-ObjectSelect-Object$null

これは、式をトレースすることで簡単に確認できます。

Trace-Command -psHost -Name ParameterBinding { Select-Object $DailyPathsToDelete -Unique}

与える:

DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Select-Object]
DEBUG: ParameterBinding Information: 0 :     BIND arg [True] to parameter [Unique]
DEBUG: ParameterBinding Information: 0 :         COERCE arg to     [System.Management.Automation.SwitchParameter]
DEBUG: ParameterBinding Information: 0 :             Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 :         BIND arg [True] to param [Unique]     SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Select-Object]
DEBUG: ParameterBinding Information: 0 :     BIND arg [System.Object[]] to parameter [Property]
DEBUG: ParameterBinding Information: 0 :         BIND arg [System.Object[]] to param [Property] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Select-Object]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing

2.それを修正する方法

使用Select-Object

$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique

使用Sort-Object

$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique

3.それを修正しない方法

Get-UniqueWindowsローカルファイルシステム(NTFS、FAT、およびバリアント)は大文字と小文字を区別しないため、シナリオでの使用はお勧めしません。

例:

$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\Temp\IMG000483\")
PS C:\> $DailyPathsToDelete | get-unique
C:\temp\IMG000483\
C:\Temp\IMG000483\
于 2012-05-20T16:32:06.443 に答える
5

あなたが試すことができます :

$unique = $DailyPathsToDelete | Get-Unique
于 2012-05-19T17:37:22.427 に答える
4
  1. Get-Uniqueを使用すると、落とし穴-Get-Uniqueでは大文字と小文字が区別され、最初にリストを並べ替える必要があります。

    $DailyPathsToDelete = $DailyPathsToDelete | Sort-Object | Get-Unique

  2. Select-Objectを使用

    $DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique

  3. Sort-Objectを使用

    $DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique

于 2012-05-20T06:26:57.013 に答える