Компьютерный форум 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=341088)

VRNComandante 29-06-2019 11:02 2877317

Батник с сложной сортировкой
 
Здравствуйте. Возможно ли, при помощи батника реализовать решение следующей задачи:
Есть две папки, условно обзовем их 1 и 2. В папке 1 находятся файлы в формате .jpg, рассортированные по подпапкам с разными именами. В папке 2, в общую кучу свалены .txt. У .jpg и .txt файлов одинаковые названия, т.е. если в папке 1 есть Иванов.jpg, то в папке 2 есть Иванов.txt и т.д. Имена всегда уникальные.
Необходимо что бы батник сравнивал названия .jpg и .txt, и при нахождении совпадения копировал .txt в папку в которой находится одноименный .jpg. Если в папке с .jpg уже есть .txt, то необходимо что бы батник сравнил даты создания .txt файла находящегося в папке с .jpg, с тем, который находится в папке 2. И если .txt в папке с .jpg старее, чем в папке 2, то его необходимо заменить более новым .txt из папки 2. Соответственно, если даты у .txt файлов одинаковые, то делать ничего не требуется.

Iska 29-06-2019 17:46 2877360

Цитата:

Цитата VRNComandante
И если .txt в папке с .jpg старее, чем в папке 2, »

Какое дата/время должно использоваться при сравнении: создания или последней модификации?

На PowerShell:
Скрытый текст
Код:

$sSourceFolder = 'C:\Мои проекты\0267\02\Source'
$sDestFolder  = 'C:\Мои проекты\0267\02\Destination'

$aDestFiles = Get-ChildItem -Path $("$sDestFolder\*.jpg") -Recurse -File

Get-ChildItem -Path $("$sSourceFolder\*.txt") -File |`
    ForEach-Object -Process {
        $sSourceFile = $_

        $aDestFiles |`
            ForEach-Object -Process {
                if($_.BaseName -eq $sSourceFile.BaseName) {
                    $sDestName = [System.IO.Path]::Combine($_.Directory.FullName, $sSourceFile.Name)
                   
                    if(-not [System.IO.File]::Exists($sDestName)) {
                        Write-Host "Copy $($sSourceFile.FullName) into $($_.Directory.FullName)"
                        $sSourceFile.CopyTo($sDestName) | Out-Null
                    } else {
                        if(([System.IO.FileInfo]$sDestName).LastWriteTime -lt $sSourceFile.LastWriteTime) {
                            Write-Host "Copy $($sSourceFile.FullName) into $($_.Directory.FullName)"
                            $sSourceFile.CopyTo($sDestName) | Out-Null
                        }
                    }
                }
            }
    }


Без проверок.

megaloman 29-06-2019 18:10 2877366

Если в системе формат даты дд.мм.гггг, то
Код:

@Echo Off
cls
        Set "Fold1=Z:\Box_In\1"
        Set "Fold2=Z:\Box_In\2"
        Set "Mask1=*.jpg"
        Set "Ext2=txt"

        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%Fold1%\%Mask1%" /S /B /A:-D`) DO (
                If Not Exist "%%~dpnf.%Ext2%" (
                        >nul 2>&1 Copy "%Fold2%\%%~nf.%Ext2%" "%%~dpnf.%Ext2%"
                ) Else (
                        If Exist "%Fold2%\%%~nf.%Ext2%" Call :DataFile "%%~dpnf.%Ext2%" "%Fold2%\%%~nf.%Ext2%"
                )
        )
pause
Exit /B

:DataFile
        Set "D1=%~t1"
        Set "D2=%~t2"
        Set /A D1=%D1:~6,4%%D1:~3,2%%D1:~0,2%
        Set /A D2=%D2:~6,4%%D2:~3,2%%D2:~0,2%
        If %D1% LSS %D2% >nul Copy %2 %1
Exit /B

Иначе выделенные строки надо переписать

VRNComandante 29-06-2019 21:53 2877402

Iska,
Цитата:

Какое дата/время должно использоваться при сравнении: создания или последней модификации?
По дате создания.

Iska 29-06-2019 21:58 2877404

Тогда поменяйте в коде упоминания свойства .LastWriteTime на .CreationTime.

VRNComandante 29-06-2019 22:32 2877410

megaloman, Iska,

Благодарочка, все работает, спасибо за помощь.

VRNComandante 01-07-2019 09:33 2877599

megaloman, Iska,

В процессе эксплуатации столкнулся с двумя проблемами.
1. В виду специфики работы программы, иногда путь выглядит не так "С:\Иванов\Иванов", а вот так "С:\АП ЦИФРА и НАЗВАНИЕ\Иванов", при чем в папке, "АП ЦИФРА и НАЗВАНИЕ", помимо папки "Иванов" может быть еще и папки "Петров" и "Сидоров".
2. Иногда одноименного .jpg в папке нет, хотя изначально я был уверен в обратном. Т.е. условно есть путь "С:\Иванов\Иванов" или "С:\АП ЦИФРА и НАЗВАНИЕ\Иванов", но так как .jpg не одноименный с .txt, то и .txt не копируется.

Можно ли как то решить эти проблемы таким образом, что бы .txt копировался в одноименную КОНЕЧНУЮ папку, без учета того, одноименный там .jpg или нет. И в вне зависимости от того как выглядит путь, так "С:\Иванов\Иванов" или так "С:\АП ЦИФРА и НАЗВАНИЕ\Иванов", .txt копировался по пути "С:\Иванов\Иванов", в первом случае, и по пути "С:\АП ЦИФРА и НАЗВАНИЕ\Иванов", во втором.

megaloman, Iska,

Т.е. Можно ли как то сделать так, что бы батник игнорировал то, как называется промежуточная папка "С:\Иванов\Иванов" или "С:\АП ЦИФРА и НАЗВАНИЕ\Иванов" и при этом копировал .txt всегда, вне зависимости от того, одноименный там .jpg или нет.

megaloman 01-07-2019 11:51 2877615

VRNComandante, тихо шифером шурша крыша едет неспеша :sorry:
В изначальной постановке искали соответствие между файл.jpg и файл.txt. Имя папки никак не декларировалось.
Поэтому вопросы:
1. Правильно ли я понимаю, что если есть файл с путём:
D:\tralala\kuku\Иванов\Иванов\Иванов.jpg, то мы ищем для него Иванов.txt, так как имя папки совпадает с именем файла.
А для файла D:\tralala\kuku\Иванов\Иванов\Цубербиллер.jpg, то для него ничего не делаем?

2. Или нам надо ориентироваться только на имя папки D:\tralala\kuku\Иванов\Иванов и копировать туда Иванов.txt вне зависимости от наличия Иванов.jpg ?

3. В папке с файлом D:\tralalalalalala\Иванов\Иванов.jpg не должно быть иных подпапок?

VRNComandante 01-07-2019 12:13 2877618

megaloman,

Цитата:

В изначальной постановке искали соответствие между файл.jpg и файл.txt. Имя папки никак не декларировалось.
Потому что я думал, что одноименные .jpg есть в папке всегда, а оказалось что нет.

Цитата:

2. Или нам надо ориентироваться только на имя папки D:\tralala\kuku\Иванов\Иванов и копировать туда Иванов.txt вне зависимости от наличия Иванов.jpg ?
Да, именно так.

Но бывает так, что что путь такой: "D:\tralalalalalala\АП1Тратата" и в папке "АП1Тратата", находится несколько папок, например "Иванов" и "Петров", и в них соответственно, тоже надо скопировать .txt.

Это возможно реализовать?

megaloman 01-07-2019 13:04 2877627

Пробуйте
Код:

@Echo Off
cls
        Set "Fold1=Z:\Box_In\1"
        Set "Fold2=Z:\Box_In\2"
        Set "Ext2=txt"

        FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%Fold1%\" /S /B /A:D`) DO Call :EndDir "%%i"
pause
Exit /B

:EndDir
        FOR /F "usebackq delims=" %%j IN (`2^>nul Dir %1 /B /A:D`) DO Exit /B 1

        If Not Exist "%~1\%~nx1.%Ext2%" (
                >nul 2>&1 Copy "%Fold2%\%~nx1.%Ext2%" "%~1\"
        ) Else (
                If Exist "%Fold2%\%~nx1.%Ext2%" Call :DataFile "%~1\%~nx1.%Ext2%" "%Fold2%\%~nx1.%Ext2%"
        )
Exit /B 0

:DataFile
        Set "D1=%~t1"
        Set "D2=%~t2"
        Set /A D1=%D1:~6,4%%D1:~3,2%%D1:~0,2%
        Set /A D2=%D2:~6,4%%D2:~3,2%%D2:~0,2%
        If %D1% LSS %D2% >nul Copy %2 %1
Exit /B

Цитата:

Цитата megaloman
3. В папке с файлом D:\tralalalalalala\Иванов\Иванов.jpg не должно быть иных подпапок? »

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

VRNComandante 01-07-2019 13:18 2877629

megaloman,

Все работает как надо, огромное спасибо.


Время: 23:22.

Время: 23:22.
© OSzone.net 2001-