我正在尝试创建一个脚本来删除虚拟服务器中的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文件,因为现在每当我在我的测试服务器上运行它时,它会尝试删除所有内容。
答案 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。