Remove-Item не удаляет никаких файлов

#powershell

#powershell

Вопрос:

Я пытаюсь удалить несколько файлов с более чем 80 серверов в моей сети. Код работает нормально и даже говорит, что файлы удаляются, однако, когда я иду и проверяю серверы …. файл все еще там. Я не совсем уверен, куда идти дальше.

(Это то, что говорит мне мой код

Файл все еще находится в папке

Вот мой код ниже:

 $filelist = @("/Contracts/Contract.con",
           "/Contracts/DefaultFinanceSale.con",
           "/Contracts/DefaultRentalReturnOrder.con",
           "/Contracts/EPOSSchedule.con",
           "/Contracts/SMSAuthorization.con",
           "/Tags/BarCode.tag",
           "/Tags/Sample 4x6.TAG",
           "/Tags/Sample FullPage.TAG",
           "/Tags/Sample FullPageBundle.TAG",
           "/Tags/Sample FullPageBundle2.TAG",
           "/Tags/Sample FullPagePackage.TAG",
           "/Tags/Sample FullPagePackage2.TAG",
           "/Tags/Sample(2).tag")

$computerlist = Get-Content C:supportscriptsserver_list.txt
$Log = "c:supportscriptslogsTest_Delete_Old_Files_$(Get-Date -Format 'yyyyMMddhhmmss').log"

Start-Transcript -path $Log -append -Force -NoClobber
foreach ($file in $filelist){
    foreach ($computer in $computerlist){
        Write-Host -ForegroundColor Yellow "Analysing $computer"

    $newfilepath = Join-Path "\$computer" "$file"
    if (test-path $newfilepath){
        Write-Host "$newfilepath file exists"
        try
        {
            Get-ChildItem $newFilePath -Force -Recurse | %{$_.Attributes = "readonly"} -ErrorAction Stop | Remove-Item
        }
        catch
        {       
            Write-host "Error while deleting $newfilepath on $computer.`n$($Error[0].Exception.Message)"
                   
        }
        Write-Host "$newfilepath file deleted"
    } else {
        Write-Information -MessageData "Path $newfilepath does not exist"
    }
}
  

}
Остановить расшифровку

Комментарии:

1. ваша -ErrorAction Stop проверка доступна только для чтения. это не влияет на Remove-Item вызов. переместите его туда, где вы хотите, чтобы он вступил в силу… [ усмешка ]

2. В файле нет дочерних элементов, так зачем делать Get-ChildItem это после того, как вы проверили, что файл существует?

Ответ №1:

Вы должны отменить два цикла foreach и выполнить $computerlist первый, в противном случае вы продолжаете переключаться между компьютерами для каждого файла в списке.

Затем, как указано, ваша $filelist переменная содержит частичные пути к файлам, а не к каталогам. Поскольку в файле нет дочерних элементов, таких как ditrectory или disk, Get-ChildItem он ничего не найдет.

Чтобы также удалить элементы, доступные только для чтения (и / или скрытые), вы можете использовать -Force переключатель на Remove-Item .

Попробуйте использовать вложенный цикл, подобный этому:

 foreach ($computer in $computerlist) {
    Write-Host -ForegroundColor Yellow "Analysing $computer"
    foreach ($file in $filelist) {
        $newfilepath = Join-Path -Path "\$computer" -ChildPath $file
        if (Test-Path -LiteralPath $newfilepath -PathType Leaf) {
            try {
                Remove-Item -LiteralPath $newfilepath -Force -ErrorAction Stop
                Write-Information "$newfilepath file deleted on computer '$computer'"
            }
            catch {
                Write-Warning "Error while deleting $newfilepath on computer '$computer'.`r`n$($_.Exception.Message)"
            }
        }
        else {
            Write-Information -MessageData "File $newfilepath does not exist on computer '$computer'"
        }
    }
}
  

Ответ №2:

Вы пробовали добавлять -Force в конец remove-item ?