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 循环,$removal 变量就会被赋值为 $dir 的值加上尾部的反斜杠。然后,您在 windows 目录上调用 remove-item。

于 2012-07-24T18:33:52.520 回答