删除cabinet文件

时间:2012-07-24 18:24:56

标签: powershell

我正在尝试创建一个脚本来删除虚拟服务器中的cabinet文件。出于某种原因,我创建的代码最终没有删除任何cabinet文件,而是尝试删除整个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 
    }

我做了一些测试,似乎由于某种原因,我试图用来收集所有cabinet文件的数组甚至没有被填充。我不确定是否有一种特定的方法来收集.cab文件,因为现在每当我在我的测试服务器上运行它时,它会尝试删除所有内容。

3 个答案:

答案 0 :(得分: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}

答案 1 :(得分:2)

使用管道,这是代码的简化版本(删除 - 如果删除文件)。代码从远程框的Windows目录中获取所有* .cab文件(递归),确保只传递文件对象然后删除它们。

Get-ChildItem "\\$server\admin$" -Filter *.cab -Recurse | 
Where-Object {!$_.PSIsContainer} | 
Remove-Item -Force -WhatIf

答案 2 :(得分:1)

  

由于某种原因,我创建的代码最终没有删除任何cabinet文件,而是尝试删除整个WINDOWS目录,我不知道为什么会这样。

之所以发生这种情况,是因为输入了for循环,而且发生这种情况是因为$ cabinetArray的长度为零。输入for循环后,$ removal变量将赋值$ dir加上一个尾随反斜杠。然后,您将在Windows目录中调用remove-item。