PowerShell を使用してファイル システム上のいくつかのアイテムを移動およびコピーするという問題に直面しています。
PowerShell v3 でも cmdlet が junction やシンボリック リンクなどのリパース ポイントを正しく処理できず、 switch と併用すると災害につながる可能性があることを実験でCopy-Item
知っMove-Item
てDelete-Item
います-Recurse
。
この偶発性を防ぎたい。実行ごとに2つ以上のフォルダーを処理する必要があるため、このようなことを考えていました。
$Strings = @{ ... }
$ori = Get-ChildItem $OriginPath -Recurse
$dri = Get-ChildItem $DestinationPath -Recurse
$items = ($ori + $dri) | where { $_.Attributes -match 'ReparsePoint' }
if ($items.Length -gt 0)
{
Write-Verbose ($Strings.LogExistingReparsePoint -f $items.Length)
$items | foreach { Write-Verbose " $($_.FullName)" }
throw ($Strings.ErrorExistingReparsePoint -f $items.Length)
}
and は配列ではなく単一の項目になる可能性があるため$ori
、これは機能しません。失敗します。に変更$dri
op-Addition
$items = @(@($ori) + @($dri)) | where { $_.Attributes -match 'ReparsePoint' }
and を含む配列で終了することもできるため$ori
、別の問題が発生します。結合の結果を にパイプするときも、 、単一のアイテム、または配列で終了できます。$dri
$null
$null
Where-Object
$null
明らかに機能する唯一の解決策は、次のより複雑なコードです
$items = $()
if ($ori -ne $null) { $items += @($ori) }
if ($dri -ne $null) { $items += @($dri) }
$items = $items | where { $_.Attributes -match 'ReparsePoint' }
if ($items -ne $null)
{
Write-Verbose ($Strings.LogExistingReparsePoint -f @($items).Length)
$items | foreach { Write-Verbose " $($_.FullName)" }
throw ($Strings.ErrorExistingReparsePoint -f @($items).Length)
}
より良いアプローチはありますか?
PowerShellコマンドレットで再解析ポイントを正しい方法で処理する方法があるかどうかは確かに興味がありますが、2つ以上の「PowerShellコレクション」を結合してフィルタリングする方法を知りたいです。
私は、現時点では、PowerShell のこの機能である「ポリモーフィック配列」は、それほどメリットがないように思われると結論付けています。
読んでくれてありがとう。