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

sergserge 01-09-2011 18:34 1744188

уникальное имя для файла
 
Добрый день!
Задача: с помощью БАТ файла копировать файл в указанную категорию и при этом присваивать ему уникальное имя, чтобы избежать повторения имен, а как следствие, затирания одного файла другим.
Предполагаемый вариант решения: присвоить файлу имя состоящее из "текущая дата"-"текущее_время".jpg
Желательно, чтобы время было указано с долями секунд, чтобы даже если за секунду копируется 2 файл, чтобы один не испортил другой
Возможно есть и другие варианты решения, но я их не знаю. Помогите, пожалуйста.

move C:\fest\1\*.jpg C:\fest\big\???.jpg

Вот файл целиком:

echo off
:loop
rem постояннос следит за появлением файлов в дериктории
:test
if exist C:\fest\*.jpg goto go
goto test
:go
rem папка 1 нужна для того, чтобы программа не пропускала файлы
move C:\fest\*.jpg C:\fest\1
rem изменяет размер файла, в конце строки стоит адрес конечного файла а после него - начального
res -resize 180 135 -rotate 90 -sharpen 20 -out jpeg -o C:\fest\small\%%.jpg C:\fest\1\*.jpg
rem переносим начальный файл в другую дерикторию, чтобы предотвратить его повторную обработку
move C:\fest\1\*.jpg C:\fest\big\%date%.jpg
goto loop

Foreigner 01-09-2011 18:55 1744215

Код:

echo off
setlocal

:loop

for %%i in (c:\fest\*.jpg) do (

    res -resize 180 135 -rotate 90 -sharpen 20 -out jpeg -o C:\fest\small\%%.jpg "%%i"
    call:move "%%i"

)
goto:loop

:move
set "name=%date:.=%-%time::=%%~x1"
move %1 "c:\fest\big\%name:,=%"

выход из батника Ctrl+C или крестик

PS. Не тестировал
ЗЫЫ. Что за res? Синтаксис как у nconvert (Xnview)

sergserge 02-09-2011 09:57 1744556

Спасибо большое! Работает! Вы мне здорово помогли. Я и не думал, что всё так замечательно получится. И код весь переписали гораздо лучше чем у меня было. Правда, я в нем теперь половину команд не понимаю :)

Вот этот самый res:
https://docs.google.com/viewer?a=v&p...EwN mM3&hl=ru

А можно сделать:

1. чтобы файлы C:\fest\small\%%.jpg сразу же получали такое же имя как и "c:\fest\big\%name:,=%" . Так, чтобы имя большого файла и маленького совпадало. Я пытался как-то переделать сам, но у меня ничего не получилось.

2. Чтобы бат-файл запускался в фоновом режиме и не на экране ни на панели задач не отображался. Тогда я смогу просто в автозагрузку его закинуть и пользователю даже не нужно будет о нем беспокоиться.

Ещё раз, спасибо Вам большое!

Foreigner 02-09-2011 18:49 1744886

Цитата:

Цитата sergserge
1. чтобы файлы C:\fest\small\%%.jpg сразу же получали такое же имя как и "c:\fest\big\%name:,=%" »

Код:

echo off
setlocal

:loop

for %%i in (c:\fest\*.jpg) do call:move "%%i"
goto:loop

:move
set "name=%date:.=%-%time::=%%~x1"
res -resize 180 135 -rotate 90 -sharpen 20 -out jpeg -o "C:\fest\small\%name:,=%" %1
move %1 "c:\fest\big\%name:,=%"

Цитата:

Цитата sergserge
2. Чтобы бат-файл запускался в фоновом режиме и не на экране ни на панели задач не отображался. »

Тогда нужна запускалка этого батника. Я для таких целей на ЛИЧНОМ ноутбуке использую hstart:
Код:

hstart /noconsole "1.cmd"
Если по каким-то соображениям это не вариант, то можно с помощью vbs:
Код:

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run("1.cmd"), 0, True

ЗЫ. Я не знаю объем поступающих в обработку файлов, но может быть будет лучше вставить в :loop небольшую паузу? Такой мониторинг, в холостую, должен серьезно грузить проц.

sergserge 03-09-2011 11:39 1745186

"ЗЫ. Я не знаю объем поступающих в обработку файлов, но может быть будет лучше вставить в :loop небольшую паузу? Такой мониторинг, в холостую, должен серьезно грузить проц."

Спасибо! Действительно, процессор был постоянно загружен на 100%.
Поискал в интернете, нашел такое решение:
есть некая программка sleep, говорят, она стандартная, скопировал её в папку Виндовз, а в скрипте написал вот так:

:loop
sleep 1
for %%i in (c:\fest\*.jpg) do call:move "%%i"
goto:loop

В общем, с вашей помощью все задачи, которые стояли передо мной выполнены. Ещё раз спасибо, всё работает замечательно. Прямо желание появилось какие-то программы писать. Только жалко, что больше ничего не нужно. Может заняться разработкой какого-нибудь вируса? :)


Время: 17:50.

Время: 17:50.
© OSzone.net 2001-