Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

Ответить
Настройки темы
CMD/BAT - Перемещение файлов по маске с созданием папки по дате в названии файла

Новый участник


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

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


Добрый день. Я не силен в создании скриптов, но хотелось бы упростить следующую задачу:есть папка "new", в которую падают видео файлы формата X700056_00000020180728203340_0001.MP4. Необходимо, что бы файлы перемещались в папки вида \x7000xx\20180728 - где x7000xx и дата берутся из имени файла.
Я нашёл такой скрипт, но так и не получилось его изменить под свою задачу:
pushd C:\new

for %%F in (*.mp4) do (

2>nul md "%%~nF"

>nul move /y "%%~nF*.*" "%%~nF"

)

Popd
Подскажите пожалуйста, в каком направлении копать)

Отправлено: 13:42, 07-08-2018

 

Ветеран


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

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


На PowerShell:
Скрытый текст
Код: Выделить весь код
Param (
    [System.String]$sSourceFolder   = "c:\new",
    [System.String]$sRootDestFolder = "c:\new"
)

if([System.IO.Directory]::Exists($sSourceFolder)) {
    if([System.IO.Directory]::Exists($sRootDestFolder)) {
        Get-ChildItem -Path $sSourceFolder -File | ForEach-Object -Process {
            if([System.Text.RegularExpressions.Regex]::IsMatch($_.Name, '^x\d+_000000\d{8}\d+_\d+\.mp4$', [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)) {
                $oMatch = [System.Text.RegularExpressions.Regex]::Match($_.Name, '^(x\d+)_000000(\d{8})\d+_\d+(\.mp4)$', [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)

                if($oMatch.Success) {
                    $sDestFolder = "$sRootDestFolder\$($oMatch.Groups[1].Value)\$($oMatch.Groups[2].Value)"

                    if(-not [System.IO.Directory]::Exists($sDestFolder)) {
                        [System.IO.Directory]::CreateDirectory($sDestFolder) | Out-Null
                    }

                    if(-not [System.IO.File]::Exists("$sDestFolder\$($_.Name)")) {
                        Write-Host "Moving source file [$($_.FullName)] into [$sDestFolder]." -ForegroundColor Cyan
                        $_.MoveTo("$sDestFolder\$($_.Name)")
                    } else {
                        Write-Host "Can't move source file [$($_.FullName)], because destination file [$sDestFolder\$($_.Name)] already exists." -ForegroundColor Cyan
                    }
                } else {
                    Write-Host "Strange error for regular expression :)." -ForegroundColor Red
                }
            } else {
                Write-Host "Found other file [$($_.Name)] in source folder." -ForegroundColor Cyan
            }
        }
    } else {
        Write-Host "Can't find destination folder [$sDestFolder]." -ForegroundColor Red
    }
} else {
    Write-Host "Can't find source folder [$sSourceFolder]." -ForegroundColor Red
}

В примере целевой каталог совпадает с исходным.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:44, 07-08-2018 | #2



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

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


Ветеран


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

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


AndreH,
если шаблон
Цитата AndreH:
X700056_00000020180728203340_0001.MP4 »
именно такой и файлов не сильно уж много, то на bat:
Код: Выделить весь код
@echo off
set "d=C:\new"
set "exp=mp4"

pushd "%d%"
 for /f "tokens=1,2* delims=_" %%a in ('dir /a-d/b "*.%exp%"') do set "nd=%%b"& call :pnd "%%a_%%b_%%c" "%%a\%%nd:~6,-6%%"
popd
pause& exit

:pnd
 if not exist "%~2" md "%~2"
 >nul move "%~1" "%~2"
exit /b
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:29, 07-08-2018 | #3


Ветеран


Contributor


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

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


Аналогично alpap, раз уж нарисовал, представляю
Код: Выделить весь код
@Echo Off
cls
	Set "FileIn=Z:\Box_In\*_??????20*.mp4"
	Set "BoxOut=Z:\Box_Out"
	FOR %%f IN ("%FileIn%") DO Call :MyMove "%%f" "%BoxOut%"
Pause
GoTo :Eof

:MyMove
	If Not Exist %1 GoTo :Eof
	FOR /F "tokens=1* delims=_" %%i IN ("%~nx1") DO Set "P1=%%i" &Set "P2=%%j"
	Set "P2=%P2:~6,8%" 
	If Not Exist "%~2\%P1%\%P2%\" Md "%~2\%P1%\%P2%"   	
	Move /Y "%~dp1%P1%_??????%P2%*%~x1" "%~2\%P1%\%P2%\"
GoTo :Eof
Исходная и выходная папка могут совпадать, в частности, Set "BoxOut=Z:\Box_In"
Надеюсь, вы понимаете, что надо указать свои пути вместо моих Z:\.........
Префикс (У Вас в частности X700056) может быть любой ненулевой длины, после него должно быть одно подчеркивание _
После подчеркивания перед датой должно быть 6 символов

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 07-08-2018 в 18:19.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:07, 07-08-2018 | #4


Ветеран


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

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


megaloman позже тоже подумал что ~6,8 надежнее.

Отправлено: 18:36, 07-08-2018 | #5


Новый участник


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

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


Ребята, спасибо огромное за помощь. Остановился на скрипте Powershell.
Чуть позже попробую скрипт cmd. Хорошего всем дня!!!!

Отправлено: 09:14, 08-08-2018 | #6



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Поиск файлов по маске, дате и времени nibble74 AutoIt 2 01-09-2017 17:31
CMD/BAT - Копирование файлов в папки по маске файла и маске папки (BAT) skyskiff Скриптовые языки администрирования Windows 7 20-09-2015 22:41
CMD/BAT - сортировка файлов по папкам по дате в названии insearches Скриптовые языки администрирования Windows 1 03-02-2013 17:03
CMD/BAT - [решено] Создание папок по дате получения файлов и перемещение в них файлов KamikadZZe Скриптовые языки администрирования Windows 1 01-09-2011 14:15
CMD/BAT - [решено] Поиск файла по маске и по дате Баян Скриптовые языки администрирования Windows 2 14-03-2011 13:32




 
Переход