Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Перемещение файлов по маске с созданием папки по дате в названии файла (http://forum.oszone.net/showthread.php?t=336064)

AndreH 07-08-2018 13:42 2825253

Перемещение файлов по маске с созданием папки по дате в названии файла
 
Добрый день. Я не силен в создании скриптов, но хотелось бы упростить следующую задачу:есть папка "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 2825268

На 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 2825318

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


megaloman 07-08-2018 18:07 2825325

Аналогично 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 символов

alpap 07-08-2018 18:36 2825334

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

AndreH 08-08-2018 09:14 2825413

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


Время: 12:54.

Время: 12:54.
© OSzone.net 2001-