Правдами или не правдами написал такое решение, в довесок добавил очистку имен файлов от мусора
Логика примерно такая: Заходит в рабочую парку - выбирает директории из которых нужно достать файло - считает сколько там файлов если больше 1 то выполняет одну функцию если много то другую
в данном решение нет переноса файлов, только вывалит новые имена на экран что легко исправляется заменяя echo "moved $NewFileName > $WorkFolder" на перемещение (move) куда надо
так же хочу заметить что скрипт устойчив к сложным названиям папок и файлов
Код:

$WorkFolder = "D:\work"
[array]$Bad = "]" , "(" , ")" , " " , "_" , "-" , "&" , "}" , "{"
# Определяем папки в которых будет поиск
$TargetFolders = dir -Directory -Recurse -LiteralPath $WorkFolder
<# Данная функция вызывается для отчистки имени файла от мусора
# ->: Имя файла
# <-: Очищеное имя файла #>
function Clean-Name($NewfileName) {
foreach ($B in $Bad) {
$NewfileName = $NewfileName.Replace($B,".")
}
$NewfileName = $NewfileName.Replace("[","")
$NewfileName = $NewfileName.Replace("..",".")
$NewfileName = $NewfileName.Replace("..",".")
Return $NewfileName
}
function LogFileInDirCount(){
Write-Host Total Files: $TotalFiles
Write-Host $Directory
}
function MoveFiles($NewFileName){
if (-not(Test-Path ($WorkFolder + $NewFileName) )) { echo "moved $NewFileName > $WorkFolder" } else { echo Error }
}
# Данная функция вызывается для работы с 1 нужным файлов в каталоге
# ->: путь к папке с файлами
function MultiFiles($Directory) {
LogFileInDirCount
$FilesInDir = dir -LiteralPath $Directory -file
foreach ($File in $FilesInDir) {
#если такого файла уже нет в корне
if (-not($WorkFolder + "\" + $File.Name -eq $File.FullName)) {
#задаем имя файла без путя к корню ( но с папкой в корне и текущим именем файла )
$NewfileName = ($File.FullName.Replace($WorkFolder,"") | Split-Path -Parent) + " - " + $File.Name
#чистим имя файла от мусора
$NewfileName = Clean-Name $NewfileName.Replace("\","")
MoveFiles $NewfileName
}
}
}
# Данная функция вызывается для работы с больше чем 1 нужным файлов в каталоге
# ->: путь к папке с файлами
function SingleFile($Directory) {
LogFileInDirCount
$FilesInDir = dir -LiteralPath $Directory -file
foreach ($File in $FilesInDir) {
#если такого файла уже нет в корне
if (-not($WorkFolder + "\" + $File.Name -eq $File.FullName)) {
#задаем имя файла без путя к корню ( но с именем папки и форматом файла)
$NewfileName = ($File.FullName.Replace($WorkFolder,"") | Split-Path -Parent) + " - " + $File.Extension
#чистим имя файла от мусора
$NewfileName = Clean-Name $NewfileName.Replace("\","")
MoveFiles $NewfileName
}
}
}
cls
# Считаем количество файлов в нужных директориях и выполняем
# функции в зависимости от количества нужных файлов в директориях
foreach ($Directory in $TargetFolders) {
$Files = dir -LiteralPath $Directory.FullName -File -Include *.txt
$TotalFiles = ($Files | Measure-Object).Count
if ($TotalFiles -gt 1 ) { MultiFiles $Directory.FullName } else { SingleFile $Directory.FullName }
Write-Host --------------------------
}