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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] сортировка файлов из папок

Ответить
Настройки темы
PowerShell - [решено] сортировка файлов из папок

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


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

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


Изменения
Автор: c4uran
Дата: 24-11-2015
Описание: на cmd нет нормального решения под любые имена файлов
Задача простая:
есть корневая папка а в ней множество папок отличаются (кроме имени) они тем что в некоторых папках 1 файл а в некоторых больше 1
так вот
если в папке 1 файл то необходимо назвать его по имени папки в которой он лежит и переместить в корень(где лежат все эти папки)
если в папке больше 1 файла то необходимо его назвать по имени папки и имени этого файла(через точку) и так же переместить в корень

Отправлено: 11:50, 23-11-2015

 

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


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

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


Похоже нужно на powershell, решение ниже не обрабатывает имена с ! знаками

Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion
set "sDestFolder=D:\test"
set "ext=*.txt"

for /f "tokens=*" %%a in ('dir /B /AD %sDestFolder%') do call :action "%%a"

endlocal
exit

:action
set "sSourcePath=%sDestFolder%\%~1"
set "sCountFile="

for /r "%sSourcePath%" %%a in (%ext%) do set /a sCountFile+=1
for /r "%sSourcePath%" %%b in (%ext%) do call :rename "%%b" "%sCountFile%"

exit /b

:rename
:: Ввод: имя файла в директории в sDestFolder

set "sNewNamePart1=!sSourcePath:%sDestFolder%=!"

:: Определяет много файлов или один
if "%~2" LEQ "1" (
set "sNewName=!sNewNamePart1:~1,-1!%~x1"
) else (
set "sNewName=!sNewNamePart1:~1,-1!.%~nx1"
)

if not exist "%~dp1!sNewName!" (
	ren "%~1" "!sNewName!"
)
if not exist "%sDestFolder%\!sNewName!" (
	move "%~dp1!sNewName!" "%sDestFolder%"
)
exit /b

Отправлено: 11:49, 24-11-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


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


Сообщения: 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] сортировка файлов из папок

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - [решено] Пропали эскизы папок (не файлов а, именно папок) demidovvas Microsoft Windows 7 5 08-03-2014 18:27
Интерфейс - Утилита/программа для полуавтоматической настройки вида множества папок ? Макс Фолдер Microsoft Windows 7 0 27-01-2014 18:00
Интерфейс - Сортировка и настройка вида папок kro44i Microsoft Windows 7 5 10-03-2013 16:29
сортировка файлов и папок на FTP-сервере Hattori_Hanzo Хочу все знать 0 17-05-2010 11:23
Интерфейс - [решено] Сортировка файлов и папок в Проводнике shesmu Microsoft Windows 2000/XP 1 23-08-2009 02:39




 
Переход