![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] сортировка файлов из папок |
|
PowerShell - [решено] сортировка файлов из папок
|
Пользователь Сообщения: 122 |
Задача простая:
есть корневая папка а в ней множество папок отличаются (кроме имени) они тем что в некоторых папках 1 файл а в некоторых больше 1 так вот если в папке 1 файл то необходимо назвать его по имени папки в которой он лежит и переместить в корень(где лежат все эти папки) если в папке больше 1 файла то необходимо его назвать по имени папки и имени этого файла(через точку) и так же переместить в корень |
|
Отправлено: 11:50, 23-11-2015 |
Пользователь Сообщения: 122
|
Профиль | Отправить 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
|
Профиль | Отправить 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 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - [решено] Пропали эскизы папок (не файлов а, именно папок) | 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 |
|