Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Пользователь


Сообщения: 122
Благодарности: 6

Профиль | Отправить PM | Цитировать


Правдами или не правдами написал такое решение, в довесок добавил очистку имен файлов от мусора

Логика примерно такая: Заходит в рабочую парку - выбирает директории из которых нужно достать файло - считает сколько там файлов если больше 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 --------------------------
}

Последний раз редактировалось c4uran, 08-12-2015 в 10:10.


Отправлено: 16:45, 07-12-2015 | #3