Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Операционные системы общие вопросы
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2022, 15:06   #341
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тогда пришлите текст bat файла еще раз и на этот раз используйте теги [CODE][/CODE]

В принципе из всего текста можно оставить только эти строчки и все должно работать как надо
Код:
@echo off
taskkill /f /im explorer.exe
cd /d %userprofile%\AppData\Local\Microsoft\Windows\Explorer
del /f /a s IconCache*
explorer
cls
Возможно в настройках окна консоли установлен параметр не закрывающий консоль при завершении bat файла. Раньше эта настройка находилась в pif файлах и его можно было просто удалить, куда теперь ее запихнули не помню.

Последний раз редактировалось macomics; 21.08.2022 в 15:15.
macomics вне форума Ответить с цитированием
Старый 22.08.2022, 11:31   #342
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,564
По умолчанию

Массовая замена оригиналов фото копиями после сохранения в Photoshop

В последних версиях Adobe Photoshop есть такой прикол, что при сохранении отредактированного фото, фотошоп сам добавляет к имени файла слово "копия" (для русской версии). Можно, конечно, при сохранении каждый раз вручную менять имя файла и соглашаться с диалогом перезаписи оригинального файла на отредактированный, но это лишние действия. Проще этот процесс автоматизировать.

Для этого сохраняем отредактированные фото с тем именем, что предлагает сам Photoshop (то есть как копии). В итоге в папке у нас будут лежать и оригинальные фото, и фото после редактирования. Примерно так:

1.jpg

Можно, конечно, вручную удалить все оригиналы, а затем переименовать все копии, убрав из имени файла слово "копия". Но это не наш метод. Вот простенький командный файл, который эту работу выполняет самостоятельно:

Код:
@echo off
setlocal enabledelayedexpansion
set copy=копия
if exist "* %copy%.jpg" (
	for /f %%n in ('dir /b "* %copy%.jpg"') do (
		if exist "%%n.jpg" del /q "%%n.jpg"
		rename "%%n %copy%.jpg" "%%n.jpg"
	)
) else (
	echo Файлы-копии не найдены
)
Важно сохранить этот файл в кодировке 866, иначе русские буквы не поймет. Потому для удобства прикрепил файл copy_rename.cmd во вложении.

Если у вас не русифицированный фотошоп, то меняем значение переменной set copy=копия на нужное.

После запуска этого батника, он находит все файлы .jpg, в имени которых присутствует слово "копия", удаляет оригинал, если тот имеется, и копию переименовывает, убирая слово "копия" из имени файла.

Результат работы:

2.jpg

Обратите внимание! После работы данного скрипта, все оригинальные фото будут уничтожены. Если они вам нужны, сохраните их отдельно.
Вложения
Тип файла: zip copy_rename.zip (340 байт, 0 просмотров)

Последний раз редактировалось Arigato; 22.08.2022 в 11:41.
Arigato вне форума Ответить с цитированием
Старый 19.02.2024, 17:19   #343
exp98
 
Регистрация: 19.02.2024
Сообщений: 7
По умолчанию

А могу я здесь задать вопрос про свой батник?
Кратко так:
проблемка в FOR /F
игнорирует символ "!" в имени каталога. Заменять динамически -- не вариант. Использовать другие средства -- не совет.
Win7
exp98 вне форума Ответить с цитированием
Старый 19.02.2024, 22:17   #344
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,564
По умолчанию

exp98, приведите код целиком. Но, подозреваю, может помочь экранирование, то есть вместо ! надо записать ^!
Arigato вне форума Ответить с цитированием
Старый 20.02.2024, 14:25   #345
exp98
 
Регистрация: 19.02.2024
Сообщений: 7
По умолчанию

Arigato, ох! погодите.
сегодня вообще непонятное происходит, с проблемой пробелов всё начиналось. Боролся 2 дня, думал, что навсегда победил, и остался пустяк.
Сейчас решил сперва попробовать, и сразу мочала-сначала -- те же пробелы.

Разбираюсь пока. Такое впечатление, что моему "CMD /A" нужно сначала прогреться.
Там не только с пробелами, вообще Set на холодную не так сработал.

Привожу работавший позавчера черновик кода (с проблемой "!").

Построчный сгруппированный список файлов, у меня их около 40 тыс
@rem dir /S /A:A /B /D /N /O:GN %pth%"*.jpg" > files.txt

в "CMD /A" пишем (комментарии уберите только)
Код:
( @echo off
 Set lst="files.txt"    ///// этот файл содержит результат "dir /s
 Set dif="diff.txt"
 Set pth="c:\Temp\наш_корневой_каталог\"
 Set et="0002 (10).jpg"       ///// это эталонный файл, с которым всё сравнивается
     
 Set full="%pth:"=%%et:"=%"
 @echo -- Beg, %TIME% -- >>diff.txt
 Set cod=444
 @echo Shablon  "full_path = "  %pth%   %et%   %full%
)
Call fc44.cmd
Файл fc44.cmd содержит
Код:
( SETLOCAL ENABLEDELAYEDEXPANSION
  FOR /F "usebackq delims=^" %%i IN (`TYPE %lst%`) DO (
   fc.exe /B %full% "%%i" >nul            ////////  ради этих "fc.exe /b" и ERRORLEVEL всё и затевалось
   IF 1 == 1  Set cod=!ERRORLEVEL!     //////// а так бы мог бы через SQL
   @echo !cod!, %full% === "%%i" >> %dif%
  )
  @echo -- Fin -- >>diff.txt
  @echo ---- %ERRORLEVEL%
  SETLOCAL DISABLEDELAYEDEXPANSION
)
@echo on
exit /B

И по ходу, не нашёл предпросмотра, сразу Отправить ((

Последний раз редактировалось exp98; 20.02.2024 в 14:29. Причина: не туда вставил строки
exp98 вне форума Ответить с цитированием
Старый 20.02.2024, 19:00   #346
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,564
По умолчанию

Необходимо отключить отложенное расширение переменных среды. Вот пример:
Код:
@echo off
setlocal enabledelayedexpansion
set lst="files.txt"
for /f "usebackq delims=^" %%i in (`type %lst%`) do (
	setlocal disabledelayedexpansion
	echo %%i
	endlocal
)
files.txt
Код:
ads
123
qw!erty!ty
lpl
Вот вывод:
Изображения
Тип файла: png 1.png (1.8 Кб, 21 просмотров)
Arigato вне форума Ответить с цитированием
Старый 20.02.2024, 21:12   #347
exp98
 
Регистрация: 19.02.2024
Сообщений: 7
По умолчанию

Незадача, пока писал резююме, сессия отключилась. Поэтому сейчас очень кратко.

1) Экранирование "^!" работает. Для етого нужно ещё модифицировать строку в скрипте:
Код:
FOR /F "usebackq delims=///" %%i IN (`TYPE %lst%`) DO (
можно delims=@@@
Потому что этих букв нет в именах.

2) Облом. Не смог воспроизвести предыдущие удачные запуски. Но логи есть, и это железное алиби

3) Сегодня с самого начала проблема с пробелами. Даже непонятно как удалось раньшеот неё избавиться.
Пробелы в подкаталогах. Их много. На первом же ломается парсинг главной команды
Код:
fc.exe /B %full% "%%i" >nul
4) Только подумалось, пробелы экранируются? их дофига. Сегодня уже всё.

Любые опробованные советы приветствуются.
Заранее спасибо.
exp98 вне форума Ответить с цитированием
Старый 20.02.2024, 21:16   #348
exp98
 
Регистрация: 19.02.2024
Сообщений: 7
По умолчанию

Колдовал полдня , ничего неполучилась. Как удалось раньше, не понимаю.
Пробовал разные добавленные кавычки. Ошибки безотказно указывают на первый встречный пробел, причём именно в каталоге. Всегда во втором аргументе.
Вот такие в основном
Код:
FC: Invalid Switch
FC: cannot open C:\TEMP\....17(7).JPG  C:\TEMP\AA.BB\333\ABC(далее в имени пробел) - No such file or folder

Call fc44.cmd
FC: Insufficient number of file specifications

Call fc44.cmd
.jpg"" was unexpected at this time.
exp98 вне форума Ответить с цитированием
Старый 21.02.2024, 02:19   #349
exp98
 
Регистрация: 19.02.2024
Сообщений: 7
По умолчанию

Усё, свой вариант дожал! Глупые ошибки были, менял названия вместо аа.бб аа_бб и обратно. Но везде, аглаз уже не различал где что.

У меня работает такой вариант, но очень долго работает. На неск.тыс. файлов размером ~100-200 К
тратится около 20 мин.

Действия такие.
Если есть возможность, то в списке файлов экранируем "!" ---> "^!", быть может, другой символ.

Вот с такой разбивкой на блоки пишем в "CMD /A" (можно и без блоков совсем, просто скопировать блоком быстрее). Лишнее убрать.
Код:
( @echo off
 Set lst="files.txt"
 Set dif="diff.txt"
 Set pth="c:\Temp\aa.bb\"
 Set et="0002 (10).jpg"
)

Set full="%pth:"=%%et:"=%"

( @echo -- Beg, %TIME% -- >>diff.txt
 Set cod=555
 @echo Shablon  "full_path = "  %pth%   %et%   %full%
)

Call fc55.cmd
В скрипт пишем delims=@
чтобы в парсинге списка не участвовал пробел (подразумевается, что "@" в списке отсутствует).
Дело в том, что ERRORLEVEL иначе не получается, только в подпрограмме.
Код:
SETLOCAL ENABLEDELAYEDEXPANSION
  FOR /F "usebackq delims=@" %%i IN (`TYPE %lst%`) DO (
  fc.exe /B %full% ""%%i"" >nul
   IF 1 == 1  Set cod=!ERRORLEVEL!
   @echo !cod!, %full% === %%i >> %dif%
  )
  @echo -- Fin -- >> %dif%
  @echo ---- %ERRORLEVEL%
  SETLOCAL DISABLEDELAYEDEXPANSION

exit /B
*********************************** *******
Эталон ещё, правда, сам с собой сравнивается. Будет на 1 больше cod==0.
Если есть различия cod==1.
Если файл не найден (например не экранировали) cod==2 или ещё что-либо
Другие значения, если ошибки в командах.

У меня это так работает.
Если допустил опечатки, заранее извиняюсь.
exp98 вне форума Ответить с цитированием
Старый 27.02.2024, 15:21   #350
exp98
 
Регистрация: 19.02.2024
Сообщений: 7
По умолчанию

Несколько очевидных слов.
1) Исправляю пустяк с моей стороны. Ранее написал команду DIR, как я получаю нужный мне список (только нужно без REM).
Цитата:
Сообщение от exp98 Посмотреть сообщение
Построчный сгруппированный список файлов, у меня их около 40 тыс
@rem dir /S /A:A /B /D /N /O:GN %pth%"*.jpg" > files.txt
На деле же мне необходимо было заключить каждую строку списка в двойные кавычки. Я это делал ручками. Всё равно в этот момент нужно анализировать, чем экранировать пробел в списке.
Можно прямо в блокноте винды контесктной заменой начала и концовки. А если расширения у файлов разных типов, то несколько типов замен. Это недолго.

Если есть ТоталКомандер, то инструментом "^+M" делается на раз.

2) Хорошо, когда есть кандидаты на дубли, а еслиих нет?
Если соорудить таким способом сравнение каждый-с-каждым из 47тыс., возникнет вопрос, как это протоколировать. Во-первых, создать промежуточный список с хэшами. Мне пришлось подключить пхп десятилетней давности. И можно было бы только им одним и ограничиться, но дело принципа сделать именно посредством CMD.

Обработка очевидна. Каждый хэш по очереди сравниваем с новым списком (который сначала пустой), а сравнив, пополняем этот новый список. Получим треугольную матрицу сравнений.

Треугольную матрицу сравнений хэшей, когда она 100х100 ещё можно получать непосредственно в форме матрицы. Но если сильно больше то текстовый вид затруднителен для анализа. Лучше строго добавлять результат в конец один под другим. Однако для 47тыс файлов дофига строк будет и очень долго.

Выход из этого простой. Предпололжить, что точных копий до 10%, и логгировать только их, тогда списки будут вменяемыми.

Ну вот и всё на этом, успехов всем!
exp98 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос для сохранения листов в отдельных файлах Neo007 Microsoft Office Excel 2 22.10.2008 18:16
Русская раскладка в bat-файлах snake-as Microsoft Office Excel 3 16.10.2008 17:59
Сортировка в файлах и записях. Паскаль Elizabeth Black Помощь студентам 2 27.05.2008 21:51
Помогите с вопросами о файлах Дима82 Помощь студентам 5 26.05.2008 19:49
Помогите, пожалуйста, решить задачу по файлах sheva_ser Паскаль, Turbo Pascal, PascalABC.NET 1 27.03.2008 19:36