PowerShell Удалить все остальное, кроме одного файла в корне и одного в подпапке - PullRequest
0 голосов
/ 03 сентября 2018

Мне нужно удалить все файлы и папки, кроме одного файла в корневой папке и еще одного файла в подпапке. Кроме того, имена файлов передаются сценарию в качестве аргумента в виде строки, разделенной запятыми, например 'file1.txt, Subfolder \ file2.txt'.

Я пытался сделать что-то подобное,

$Path = "C:\\Delete\\"
$Argument= "file1.txt,Subfolder\\file2.txt"
$ExcludedFiles = [string]::Join(',', $Argument);
$files = [System.IO.Directory]::GetFiles($Path, "*", "AllDirectories")

foreach($file in $files) { 
    $clearedFile = $file.replace($Path, '').Trim('\\');

    if($ExcludedFiles -contains $clearedFile){
        continue;
    } 

    Remove-Item $file
}

При этом все папки остаются и все файлы удаляются. Может ли кто-нибудь предложить, пожалуйста, как я должен попытаться сделать это, так как у меня есть трудности в этом.

1 Ответ

0 голосов
/ 03 сентября 2018

Самый простой способ сделать это - использовать параметр -Exclude в get-childitem.

Вот примеры для исключения файла:

Get-ChildItem C:\Path -Exclude SampleFileToExclude.txt| Remove-Item -Force

Исключить файлы с определенным расширением, используя подстановочный знак:

Get-ChildItem C:\Path -Exclude *.zip | Remove-Item -Force

Получить все файлы рекурсивно и исключить одно и то же:

Get-ChildItem C:\Path -Recurse -Exclude *.zip | Remove-Item -Force

Исключить список элементов по вашему желанию в той же команде:

Get-ChildItem C:\Path -Recurse -Exclude *.zip, *.docx | Remove-Item -Force

Вы даже можете использовать с массивом и где условие:

$exclude_ext = @(".zip", ".docx")
$path = "C:\yourfolder"
Get-ChildItem -Path $path -Recurse | Where-Object { $exclude_ext -notcontains $_.Extension }

И тогда вы можете удалить, используя Remove-Item

Надеюсь, это поможет.

...