1

仮想サーバーのキャビネット ファイルを削除するスクリプトを作成しようとしています。何らかの理由で、私が作成したコードはキャビネット ファイルを削除せず、代わりに WINDOWS ディレクトリ全体を削除しようとしますが、なぜこれが発生しているのかわかりません。何も見つからないので、誰かが問題が何であるかについて何か考えがあるかどうか興味がありました:

$dir = "\\$server" + '\C$\windows'

$cabinetArray = @()
foreach ($item in get-childitem -path $dir){
    if ($item.name -like "*.cab"){
        $cabinetArray = $cabinetArray + $item
        }
    }

for ($i = 0; $i -le $cabinetArray.length; $i++){
    $removal = $dir + "\" + $cabinetArray[$i]
    remove-item $removal -force -recurse 
    }

いくつかのテストを行ったところ、何らかの理由で、すべてのキャビネット ファイルを収集するために使用しようとしているアレイが、何らかの理由でいっぱいになっていないようです。.cab ファイルのみを収集する特定の方法があるかどうかはわかりません。現在、テスト サーバーでこれを実行すると、すべてを削除しようとするからです。

4

3 に答える 3

2

そのフォルダー内のすべての cab ファイルを削除することが良い考えかどうかはわかりませんが、あなたの質問にお答えします。PoweShell がすべての処理を行ってくれる場合、多くの計算を行い、オブジェクトの独自のコレクションを構築しています。次のようなことを試してください:

$dir = "\\" + $server + '\C$\windows'
$cabinetFiles = Get-ChildItem -Path $dir -Filter "*.cab" -Recurse
$cabinetFiles | %{
    Remove-Item -Path $_.FullName -Force
}

または、ワンライナーとして:

Get-ChildItem -Path ("\\" + $server + '\C$\windows') -Filter "*.cab" -Recurse | %{Remove-Item -Path $_.FullName -Force}
于 2012-07-24T18:33:28.300 に答える
2

パイプラインを使用してください。コードの簡略化されたバージョンを次に示します (ファイルを削除する -WhatIf を削除します)。このコードは、リモート ボックスの Windows ディレクトリからすべての *.cab ファイルを (再帰的に) 取得し、ファイル オブジェクトのみが渡されるようにしてから削除します。

Get-ChildItem "\\$server\admin$" -Filter *.cab -Recurse | 
Where-Object {!$_.PSIsContainer} | 
Remove-Item -Force -WhatIf
于 2012-07-24T18:43:31.923 に答える
1

何らかの理由で、私が作成したコードはキャビネット ファイルを削除せず、代わりに WINDOWS ディレクトリ全体を削除しようとしますが、なぜこれが発生しているのかわかりません。

for ループに入るために発生しています。これは、$cabinetArray の長さがゼロであるために発生しています。for ループに入ると、$dir の値と末尾のバックスラッシュが $removal 変数に割り当てられます。次に、windows ディレクトリで remove-item を呼び出しています。

于 2012-07-24T18:33:52.520 に答える