2

PowerShell を使用してファイル システム上のいくつかのアイテムを移動およびコピーするという問題に直面しています。

PowerShell v3 でも cmdlet が junction やシンボリック リンクなどのリパース ポイントを正しく処理できず、 switch と併用すると災害につながる可能性があることを実験でCopy-Item知っMove-ItemDelete-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、これは機能しません。失敗します。に変更$driop-Addition

$items = @(@($ori) + @($dri)) | where { $_.Attributes -match 'ReparsePoint' }

and を含む配列で終了することもできるため$ori、別の問題が発生します。結合の結果を にパイプするときも、 、単一のアイテム、または配列で終了できます。$dri$null$nullWhere-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 のこの機能である「ポリモーフィック配列」は、それほどメリットがないように思われると結論付けています。

読んでくれてありがとう。

4

2 に答える 2

1

null を捨てるフィルターを追加するだけです。あなたは正しい軌道に乗っています。

$items = @(@($ori) + @($dri)) | ? { $_ -ne $null }

于 2012-12-24T05:00:45.790 に答える
0

私はしばらくPowershell 3を使用していますが、これは2.0でも機能するはずです。

$items = @($ori, $dri) | %{ $_ } | ? { $_.Attributes -match 'ReparsePoint' }

基本的には、内部配列を反復処理し、各内部要素 ( ) をパイプライン%{ $_ }に渡すことによって内部配列をアンロールする foreach ループです。$_Null はパイプラインから自動的に除外されます。

于 2013-02-18T07:29:54.653 に答える