Войти

Показать полную графическую версию : Перемещение файлов по маске с созданием папки по дате в названии файла


AndreH
07-08-2018, 13:42
Добрый день. Я не силен в создании скриптов, но хотелось бы упростить следующую задачу:есть папка "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
Подскажите пожалуйста, в каком направлении копать)

Iska
07-08-2018, 14:44
На 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
}
В примере целевой каталог совпадает с исходным.

alpap
07-08-2018, 17:29
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

megaloman
07-08-2018, 18:07
@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 символов

alpap
07-08-2018, 18:36
megaloman позже тоже подумал что ~6,8 надежнее.

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




© OSzone.net 2001-2012