PDA

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


VRNComandante
29-06-2019, 11:02
Здравствуйте. Возможно ли, при помощи батника реализовать решение следующей задачи:
Есть две папки, условно обзовем их 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
И если .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
Если в системе формат даты дд.мм.гггг, то@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
Iska, Какое дата/время должно использоваться при сравнении: создания или последней модификации?

По дате создания.

Iska
29-06-2019, 21:58
Тогда поменяйте в коде упоминания свойства .LastWriteTime на .CreationTime.

VRNComandante
29-06-2019, 22:32
megaloman, Iska,

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

VRNComandante
01-07-2019, 09:33
megaloman, Iska,

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

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

megaloman, Iska,

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

megaloman
01-07-2019, 11:51
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
megaloman,

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

Потому что я думал, что одноименные .jpg есть в папке всегда, а оказалось что нет.

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

Да, именно так.

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

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

megaloman
01-07-2019, 13:04
Пробуйте@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
3. В папке с файлом D:\tralalalalalala\Иванов\Иванов.jpg не должно быть иных подпапок? » Вы не ответили, здесь реализовано именно так. Ориентировался на имя папки с максимальной вложенностью в пути без подпапок

VRNComandante
01-07-2019, 13:18
megaloman,

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




© OSzone.net 2001-2012