Как не работать с каталогом, если * .tmp существует где-нибудь в нем? - PullRequest
1 голос
/ 11 мая 2019

Этот код должен идти через все каталоги верхнего уровня в текущем каталоге, выполняя проверку временного файла, и, если он не существует, он перемещает каталог.

$processDirectories = {
    foreach ($childDirectory in Get-ChildItem -Force -Directory) {
        test-path "$childDirectory\*.tmp"
        move-item -LiteralPath "$childDirectory" -Destination "d:\"
    }
}

Я не знаю, как остановить запусккод для каталогов, где *.tmp найден.Кроме того, этот метод проверяет только корень каждого вложенного каталога на *.tmp, а не все дерево внутри.

Ответы [ 2 ]

2 голосов
/ 11 мая 2019

Если я понимаю ваши ограничения, здесь есть два варианта,
считая количество *.tmp в подпапках. Если ноль, то Move-Item папка.

  1. Перебор папок 1-го уровня

    foreach ($childDirectory in Get-ChildItem -Force -Directory) {
      if ((Get-ChildItem $childDirectory -recurse -Include *.tmp, *.!qb).Count -eq 0){
        Move-Item -LiteralPath "$childDirectory" -Destination "d:\" -WhatIf
      }
    }
    
  2. один трубопровод

    Get-ChildItem -Force -Directory | Where-Object {
      (Get-ChildItem $_ -recurse -Include *.tmp, *.!qb).Count -eq 0} |
        Move-Item -Destination "d:\" -WhatIf
    

Если вывод выглядит нормально, удалите трейлинг -WhatIf

2 голосов
/ 11 мая 2019

Просто используйте if

 foreach ($childDirectory in Get-ChildItem -Force -Directory) {
     if (!(test-path "$childDirectory\*.tmp")) {
        move-item -LiteralPath "$childDirectory" -Destination "d:\"
     }
 }

Что касается подкаталогов, используйте переключатель -Recurse из Get-ChildItem.

...