以下のコードが返されるのはなぜ$null
ですか?一意の値だけを保存しようとしています。
$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique
以下のコードが返されるのはなぜ$null
ですか?一意の値だけを保存しようとしています。
$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique
短い答え:
すべての一意のパスを取得するには、スイッチにパイプ$DailyPathsToDelete
しSelect-Object
て設定する必要がありますUnique
。
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
長い答え:
1.なぜ機能しないのか
スクリプトを実行した後は、(スクリプトの2行目で)パラメーターにバインドされているため、 $DailyPathsToDelete
equalsになります。コマンドレットのパラメーターが指定されていなかったため、の呼び出しの結果はです。$null
$DailyPathsToDelete
Property
InputObject
Select-Object
Select-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-Unique
Windowsローカルファイルシステム(NTFS、FAT、およびバリアント)は大文字と小文字を区別しないため、シナリオでの使用はお勧めしません。
例:
$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\Temp\IMG000483\")
PS C:\> $DailyPathsToDelete | get-unique
C:\temp\IMG000483\
C:\Temp\IMG000483\
あなたが試すことができます :
$unique = $DailyPathsToDelete | Get-Unique
Get-Uniqueを使用すると、落とし穴-Get-Uniqueでは大文字と小文字が区別され、最初にリストを並べ替える必要があります。
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object | Get-Unique
Select-Objectを使用
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
Sort-Objectを使用
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique