Удалить файлы с помощью имен, содержащихся в массиве с foreach l oop и Remove-Item в Powershell - PullRequest
1 голос
/ 05 января 2020

С помощью Powershell я пытаюсь удалить некоторые файлы в каталоге. У меня есть массив, который содержит имена файлов, которые я хочу сохранить (они находятся в массиве $ NameOfFilesToKeep). Все остальные файлы должны быть удалены. Вот код, который я использую:

####### YOU HAVE TO MODIFY THIS SETTINGS #######


$GenericIDandNameOfProject = "[19123]PARIS EST"  #If the name of your files is something like this [19123]PARIS EST_XXX.XML , it should be equal to "[19123]PARIS EST"

$Entries = "10
8
9
16"   #Be careful, this " should be on the same line as the last number!


####### END OF THE SETTINGS YOU HAVE TO MODIFY #######



$IDofInterestingElements = $Entries.split("`n")


for ($i=0; $i -lt $IDofInterestingElements.Length-1; $i++) {
    $IDofInterestingElements[$i] = $IDofInterestingElements[$i].Substring(0,$IDofInterestingElements[$i].Length-1)
}

Write-Output ("Soooo, you want " + $IDofInterestingElements.Length + " files at the end")

$NameOfFilesToKeep = @()

foreach ($ID in $IDofInterestingElements) {
    $NameOfFilesToKeep += $GenericIDandNameOfProject + "_" + $ID + ".XML"
}


$CurrentDirectory = (Get-Location).path

foreach ($file in dir $CurrentDirectory) {
    if ($NameOfFilesToKeep.Contains($file.name)) {
        Write-Output (${file})
    }
    else {
        Remove-Item "${CurrentDirectory}\${file}"
    }
}

Start-Sleep 100

Название файлов: «[19123] PARIS EST_XXX. XML», где XXX - это число, например [19123] PARIS EST_10. XML

Это просто не работает. Я думаю, что скучаю по чему-то важному в части Remove-Item. Что может быть не так с моим кодом?

Редактировать

Я добавил полный код для лучшего понимания.

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Мне не удалось выяснить, ПОЧЕМУ ваш код не удаляет файлы. [ blu sh] однако, я могу заставить его работать, если я заменю foreach l oop этой версией ...

foreach ($file in (Get-ChildItem -LiteralPath $CurrentDirectory -File)) {
    if ($NameOfFilesToKeep.Contains($file.name)) {
        Write-Output $File.FullName
    }
    else {
        Remove-Item -LiteralPath $File.FullName -WhatIf
    }
}

не забудьте удалить -WhatIf когда вы готовы фактически удалить вещи.

0 голосов
/ 05 января 2020

Я думаю, что вы хотите удалить $ file.name. В противном случае $ file будет приведен в соответствие ко всему пути (это зависит от версии powershell). Обратите внимание, что IList.Contains () (с массивами) чувствителен к регистру https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.system-collections-ilist-contains?view=netframework-4.8.

$nameoffilestokeep = echo file1.txt file2.txt

$CurrentDirectory = (Get-Location).path

foreach ($file in dir $CurrentDirectory) {
    if ($NameOfFilesToKeep.Contains($file.name)) {
        Write-Output (${file})
    }
    else {
        Remove-Item "${CurrentDirectory}/$($file.name)" -whatif
    }
}

На самом деле ваша версия работает для меня в ps5 для windows. Но мы не знаем, как выглядит $ nameoffilestokeep. Это должен быть массив строк.

РЕДАКТИРОВАТЬ: новый код должен работать в основном, за исключением того, что с .substring () вы убираете 1 символ в конце каждой строки. Квадратные скобки в именах файлов доставят вам неприятности, потому что они являются частью групповых символов в powershell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...