Перебирайте папки и проверяйте, существует ли определенный файл - PullRequest
0 голосов
/ 21 мая 2018

Меня спросили следующее: переберите список папок, затем переберите список подпапок и, наконец, проверьте, есть ли файл с именем «can_erase.txt» в каждой подпапке.Если файл существует, я должен прочитать его, сохранить параметр и удалить соответствующую папку (не основную папку, а подпапку, содержащую файл).

Я запустил цикл for, ноимена папок случайные, и я зашел в тупик, поэтому подумал, что могу использовать foreach.Кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ: мой код все еще довольно простой, так как я знаю имена родительских папок (они называются stream1 , stream2 , stream3 и stream4 ), но их подпапки имеют случайное имя.

Мой текущий код:

For ($i=1; $i -le 4; $i++)
{
    cd "stream$i"
    Get-ChildItem -Recurse  | ForEach (I don't know which parameters I should use)
    {
        #check if a certain file exists and read it
        #delete folder if the file was present
    }
        cd ..
}

1 Ответ

0 голосов
/ 21 мая 2018

В этой ситуации вам понадобится несколько циклов, чтобы получить папки потоков, получить эти подпапки, а затем проанализировать все файлы в подпапках.

foreach ($folder in (Get-ChildItem -Path 'C:\streamscontainerfolder' -Directory)) {
    foreach ($subFolder in (Get-ChildItem -Path $folder -Directory)) {
        if ('filename' -in (Get-ChildItem -Path $subFolder -File).Name) {
            Remove-Item -Path $subFolder -Recurse -Force
            continue
        }
    }
}

Альтернативой этому является использование конвейера.:

# This gets stream1, stream2, etc. added a filter to be safe in a situation where
# stream folders aren't the only folders in that directory
Get-ChildItem -Path C:\streamsContainerFolder -Directory -Filter stream* |
    # This grabs subfolders from the previous command
    Get-ChildItem -Directory |
        # Finally we parse the subfolders for the file you're detecting
        Where-Object { (Get-ChildItem -Path $_.FullName -File).Name -contains 'can_erase.txt' } |
        ForEach-Object {
            Get-Content -Path "$($_.FullName)\can_erase.txt" |
                Stop-Process -Id { [int32]$_ } -Force # implicit foreach
            Remove-Item -Path $_.FullName -Recurse -Force
        }

По умолчанию я бы рекомендовал использовать -WhatIf в качестве параметра для Remove-Item, чтобы вы могли видеть, что он будет делать.


Бонус после долгих размышлений:

$foldersToDelete = Get-ChildItem -Path C:\Streams -Directory | Get-ChildItem -Directory |
    Where-Object { (Get-ChildItem -Path $_.FullName -File).Name -contains 'can_erase.txt' }
foreach ($folder in $foldersToDelete) {
    # do what you need to do
}

Документация:

...