Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 3

Автор: wolf0425
Дата сообщения: 16.05.2007 10:27

Цитата:
Но все равно с dir имно неудобно огород городить.

неудобно дракона трахать - хвост мешает

for /f "tokens=*" %%a in ('dir /b /o-d /a-d \\server\share\*.*') do set "lastfile=%%a" && goto :exitfor

полный список бэкапов на сервере всё равно же придется чем-то генерить...

а вот список серверов/шар - можно и в файлик, и ещё for снаружи на их перебор.

Добавлено:
Maza Faka
Set BackUp=\\comp1\c\BackUp \\comp1\d\BackUp
Dir /b /s /a:-d /o:-d %BackUp%
выдаст сначала все файлики \\comp1\c\BackUp в сортировке по дате, потом все файлики \\comp1\d\BackUp

ты уверен, что именно такого результата хотел?
Автор: Maza Faka
Дата сообщения: 16.05.2007 10:49
wolf0425
Ну вот
Цитата:
какая нафиг разница - пути или параметра - "строку с кавычками внутри (строки)"

Насколько я понял:

Код:
reg add HKLM\SOFTWARE\MyPROG\Prog /v """Da"""ta""" /t REG_SZ /d 123
Автор: GORA2
Дата сообщения: 16.05.2007 10:59
Всем доброго времени суток.
Помогите решить задачку: Имеется файл-список "C:\DOCUME~1\Evgenij\LOCALS~1\Temp\CMD4F99.tmp", например,
примерно такого содержания
Цитата:
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath\
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\Realtek AC97 Audio Drivers v5.10.00.5970\
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath 07.05.16 11-35.res
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\Archive 07.05.15 15-32.7z
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\0test 07.05.15 13-18.7z
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\archiVE.7z
В нем могут быть и только папки, и только файлы, и то и другое вместе. Количество записей в этом файле от 1 до ... ну много вобщем .
Задача: выделить в переменную %soursepart% путь к папке источнику т.е. D:\DISTRIBUT 1\7-Zip\1_7zSD_test\ в данном примере.
Автор: wolf0425
Дата сообщения: 16.05.2007 11:36
GORA2

Цитата:
Задача: выделить в переменную %soursepart% путь к папке источнику т.е. D:\DISTRIBUT 1\7-Zip\1_7zSD_test\


Код: @echo off
setlocal enabledelayedexpansion

for /f "tokens=*" %%a in ('type files.txt') do set "soursepart=%%~dpa" & goto :_dirname
:_dirname
type files.txt | find /v "!soursepart!" >nul && for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursepart=%%~dpa" & goto :_dirname

Set soursepart
Автор: GORA2
Дата сообщения: 16.05.2007 12:25
wolf0425
Что то не получается. Может потому что я немного изменил!?
Код: @echo off
echo %%~1    = %~1
setlocal enabledelayedexpansion

for /f "tokens=*" %%a in ('%~1') do set "soursepart=%%~dpa" & goto :_dirname
:_dirname
type files.txt | find /v "!soursepart!" >nul && for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursepart=%%~dpa" & goto :_dirname

Set soursepart

pause>nul
Автор: slayer120
Дата сообщения: 16.05.2007 12:27
wolf0425

Цитата:
полный список бэкапов на сервере всё равно же придется чем-то генерить

Зачем, я ж писал бакапы на нескольких серваках лежат по одному на разных винтах
и чем тебе здесь dir поможет? Построит список из одного файла?
Потом dir в список путь не выводит (только имена) - надо ручками добавлять.
да и файлов не так много по количеству -от 3 до 6 на серваке быстрее ручками список сделать чем с батником возится
Автор: euheny
Дата сообщения: 16.05.2007 12:31
Maza Faka

Цитата:
"""Da"""ta"""

Цитата:
будет выглядеть так: ("Da"ta")

ну и примерчик , этож кому это понадобится ?
логичнее предположить то что будет выглядеть так

"Data" - it my data
Автор: GORA2
Дата сообщения: 16.05.2007 12:45
wolf0425
Все разобрался! Сам был не прав. Вам спасибо.
Автор: Maza Faka
Дата сообщения: 16.05.2007 12:53
euheny

Цитата:
ну и примерчик , этож кому это понадобится ?


Просто вопрос поставили так, что бы в середине текста были кавычки. Для твоего примера - утрой кавычки, если будешь добавлять значения в реестр из батника или командной строки.
Пример:

Код:
@Echo off
Reg add HKLM\Software\MyProgs\Program /v """"Data""" - it my data" /t REG_SZ /d Test
Автор: wolf0425
Дата сообщения: 16.05.2007 13:48
slayer120

Цитата:
Зачем, я ж писал бакапы на нескольких серваках лежат по одному на разных винтах

но позже ты сказал что 1сервер=1шара с бэкапами

Цитата:
Потом dir в список путь не выводит (только имена) - надо ручками добавлять.

почему это не выводит? именно полный путь dir /b /s и выводит, руками добавлять ничего не надо. UNC тоже нормально выводит.


Цитата:
да и файлов не так много по количеству -от 3 до 6 на серваке быстрее ручками список сделать чем с батником возится

и что, такой сделанный сегодня ручками список - кому-то будет нужен через неделю?
там что - имена бэкапов не автогенерятся, а всё время одинаковые???

откуда при этом возьмутся более новый бэкап на другом диске, но со старым именем?
если список можно руками составить один раз - то откуда взялся вопрос сравнения дат: их же тоже можно глазами сравнивать...

Maza Faka
скорее уж будет
Reg add HKLM\Software\MyProgs\Program /v Testname /d """"Data""" - it my data"

GORA2
for /? прочти наконец. подумай - что ж ты поменял.
for /f "tokens=*" %%a in ('%~1')
предполагает что %1 - исполняемый файл, stdout которого ты хочешь обработать.
в оригинале stdout генерил 'type files.txt' - причем в ДВУХ местах командника.

если %1 = имя файла-списка - замени в оригинале type files.txt на type %1 или на type "%~1"
можно и без type написать оба места, непосредственно указывая файла в for и find - но с type достаточно RO доступа к файлу и атрибуты не волнуют. иногда полезно.

Добавлено:
Maza Faka

Цитата:
Какой у тебя номер аськи?

какая разница, если на работе её использовать запрещено?
Автор: Maza Faka
Дата сообщения: 16.05.2007 13:59
wolf0425

Цитата:
какая разница, если на работе её использовать запрещено?

А дома?

Кстати, я тебе в личку писал, ты наверное не заметил?
Автор: slayer120
Дата сообщения: 16.05.2007 14:36
wolf0425

Цитата:
там что - имена бэкапов не автогенерятся, а всё время одинаковые???

да вот так все запущено .

Цитата:
откуда при этом возьмутся более новый бэкап на другом диске, но со старым именем?
если список можно руками составить один раз - то откуда взялся вопрос сравнения дат

Просто часть серваков старых , много маленьких (80Г) винтов, бакапы пишутся на разные винты локально. На новых пишутся в один каталог. Система типа такая
в понедельник -file1, потом file2 и т.д. Имена не меняются. Смысла добавлять дату в имя не вижу - все равно не уместится больше файлов.
А так в бекапе стоит -переписывать старый файл. Бакап полный (систем стате плюс файлопомойка). С инкрементными теперь не связываюсь - не раз обжигался.


Цитата:
их же тоже можно глазами сравнивать...

вопрос стоял чтоб автоматом копировать последний по времени файл. А так можно тупо прописать в список
по 1 любому бакапу с каждого сервера и копировать. Займет три строчки.
Автор: GoreZ2007
Дата сообщения: 16.05.2007 14:55
Преамбула: при распаковке архива rar (primer.exe SFX) запускаю батник, который его удаляет, но т.к. архив не успевает вовремя выгрузиться из памяти, то возникает сообщение "отказано в доступе". Выхожу из положения тем, что в цикле все время пытаюсь удалить и , когда все ОК выхожу.
:metka
del primer.exe
if exist primer.exe goto metka
Амбула или вернее вопрос:
Как сделать так, чтобы не выводилось сообщение "отказано в доступе"? Или может знатоки подскажут как сей алгоритм сделать изящнее?
Автор: wolf0425
Дата сообщения: 16.05.2007 15:01

Цитата:
в понедельник -file1, потом file2 и т.д. Имена не меняются. Смысла добавлять дату в имя не вижу - все равно не уместится больше файлов.


Цитата:
вопрос стоял чтоб автоматом копировать последний по времени файл. А так можно тупо прописать в список по 1 любому бакапу с каждого сервера и копировать.

так достаточно по одному любому (из 5-7) или же надо в момент запуска батника выяснять, кто из этих 7 писался последним - ты уж для себя выбери что-то одно, потом спрашивай


Цитата:
бакапы пишутся на разные винты локально.

это как - на разные винты сервера1 пишутся разные куски его бэкапа, или один и тот же, выбирая место по RND?
Автор: Maza Faka
Дата сообщения: 16.05.2007 15:14
GoreZ2007
Запускай распаковку при помощи батника
например:

Код:
@Echo off
Rar.exe e myArchive.exe C:\MyFolder
del /q /f myArchive.exe
Автор: GORA2
Дата сообщения: 16.05.2007 15:35
wolf0425
Рано я обрадовался. Не совсем то, что я просил. Вот то, что сейчас у меня:
Код: @echo off
setlocal enabledelayedexpansion
set partlistfile="%~1"
CHCP 1251>nul
for /f "tokens=*" %%a in ('type %partlistfile%') do set "soursepart=%%~dpa" & goto :_dirname
:_dirname
type %partlistfile% | find /v "!soursepart!" >nul && for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursepart=%%~dpa" & goto :_dirname
CHCP 866>nul
Set soursepart
pause>nul
Автор: wolf0425
Дата сообщения: 16.05.2007 16:49
GORA2

Цитата:
Не совсем то, что я просил.

вообще-то просил ты именно что получил. другой вопрос - может хотел по-другому

Цитата:
Это верно работает, если в файл-списке есть файл(ы), а если папка и только ОДНА то soursepart содержит путь+имя данной папки.

вообще-то так и задумывалось - найти наибольший общий путь...

Цитата:
И если можно, очень бы хотелось еще переменную soursename с именем (без пути) папки или файла из файл-списка, если в файл-списке только один файл или папка соответственно. Т.е. если только одна запись.

если заведомо надо получить путь + имя раздельно,
а не максимальный общий путь - второй цикл будет таким

Код: :_dirname
if "!soursepart:~-1!"=="\" set "soursepart=!soursepart:~0,-1!"
for /f "tokens=*" %%a in ("!soursepart!") do set "soursename=%%~nxa" && set "soursepart=%%~dpa"
type %partlistfile% | find /v "!soursepart!" >nul && goto :_dirname
Автор: slayer120
Дата сообщения: 16.05.2007 16:56
wolf0425

Цитата:
это как - на разные винты сервера1 пишутся разные куски его бэкапа, или один и тот же, выбирая место по RND?

Не на разные винты пишутся одинаковые бакапы но по разным дням на разные винты
(на 80 архив 30-40 гб тока раз помещается)
Цитата:
один и тот же, выбирая место по RND?

мне надо было
Цитата:
в момент запуска батника выяснять, кто из этих 7 писался последним


виноват, мутно объяснил задачу Спасибо всем за помощь !
Автор: Maza Faka
Дата сообщения: 16.05.2007 17:09
GORA2
Вот накарябал, как смог, получилось некрасиво, но работает:

Код:
@Echo off
setlocal enabledelayedexpansion

for /f "delims=: tokens=1*" %%a in ('find /v /c "" files.txt') do (
if %%b EQU 1 (
for /f "tokens=*" %%b in (files.txt) do (
Set "soursename=%%b"
set soursename=!soursename:~0,-1!
Call :Name "!soursename!")) Else (goto :Begin)
)
Goto :EOF

:Name
Set soursename=%~nx1
Set soursename
Goto :EOF

:Begin
@echo off
setlocal enabledelayedexpansion
set partlistfile=Files.txt
CHCP 1251>nul
for /f "tokens=*" %%a in ('type %partlistfile%') do set "soursepart=%%~dpa" & goto :_dirname
:_dirname
type %partlistfile% | find /v "!soursepart!" >nul && for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursepart=%%~dpa" & goto :_dirname
CHCP 866>nul
Set soursepart
Автор: NIKZZZZ
Дата сообщения: 16.05.2007 18:39
slayer120
Если я правильно понял, нужен только один файл из списка со старшей датой, а не сам отсортированный список.


Код: echo off
Set TempDate=00000000
Set ResultName=
for /f "tokens=*" %%i in (files.txt) do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do call :_1 %%l%%k%%j%%m%%n %%i
)
echo Result - %ResultName% Date - %TempDate%
Rem copy %ResultName% КудыНадо
goto :eof

:_1
if X%1 GTR X%TempDate% (
Set ResultName=%2
Set TempDate=%1
)
Автор: euheny
Дата сообщения: 17.05.2007 03:45
Maza Faka
окей , теперь пошло
а из какого документа это(этот хелп)?
Автор: Maza Faka
Дата сообщения: 17.05.2007 06:48
euheny
Да уже и не помню, в каком-то help-е читал, про удваивание-утраивание символа "^", что бы использовать этот символ, как литеральный. Так же можно поступить и с кавычками...
Автор: GORA2
Дата сообщения: 17.05.2007 07:48
wolf0425
Начну с благодарности Вам и не сердитесь я только учусь. Показалось, что я довольно подробно изложил задачу, привел пример файл-списка, указал путь, который мне нужен из данного файл-списка, но... оказалось, что только показалось .
Вот развернутая постановка задачи.
На панели ТС выделены файл(ы) и/или папка(и). Пути с именами выделенных объектов передаются в батник с помощью файл-списка.
Цитата:
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath\
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\Realtek AC97 Audio Drivers v5.10.00.5970\
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath 07.05.16 11-35.res
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\Archive 07.05.15 15-32.7z
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\0test 07.05.15 13-18.7z
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\archiVE.7z
Файл список в кодировке win1251. Все выделенные объекты могут даходиться только в одной папке (В данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или в корне диска (например, D:\) Записей в файл-списке может быть от 1 до N. Путь к файл-списку передается в батник в переменной ~1.
Задача:
1. Переменная soursepart долна содержать имя_и_путь_папки в которой находятся выделенные объекты (в данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или D:\ , если объекты расположены в корне диска D.
2. Переменная soursename долна содержать:
а) если в списке одна запись и она является папкой, то имя_этой_папки (в данном примере это InstallPath, если эта запись состоит из D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath\)
б) если в списке одна запись и она является файлом, то имя_этого_файла без расширения (в данном примере это InstallPath 07.05.16 11-35, если эта запись состоит из D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath 07.05.16 11-35.res)
в) если в списке больше чем одна запись, то имя_папки уровнем выше (в данном примере это 1_7zSD_test). Если объекты расположены в корне диска, то имя фиксированное - Archive
3 Переменная allfile долна содержать общее число файлов (только файлов без папок) в файл-списке. Диапазон от 0 до 4, остальные файлы, если их больше, не интересут.
4 Переменнные var1, var2, var3, var4 долны содержать имя_и_путь_фаила для первых четырех файлов в файл-списке, остальные файлы, если их больше, не интересут.

Сейчас я решаю эту задачу так
Код: @echo off
setlocal enabledelayedexpansion
CHCP 1251>nul
set allfile=0& set flagmany=0& FOR /F "tokens=*" %%i IN (%1) DO (
    set "tempi=%%i" & IF NOT "!tempi:~-1!"=="\" (
        set /a allfile+=1 & set "var!allfile!=%%i" & set "soursename=%%~ni" & set "soursepart=%%~dpi"
    ) ELSE (
        set /a flagmany+=1 & FOR /D %%a IN ("!tempi:~0,-1!.txt") DO (set "soursename=%%~na" & set "soursepart=%%~dpa")
    )
)
set /a flagmany+=allfile & IF !flagmany! GTR 1 (
    IF "!soursepart:~-2!"==":\" (set "soursename=Archive") ELSE (FOR /D %%a IN ("!soursepart:~0,-1!.txt") DO (set "soursename=%%~na"))
)
CHCP 866>nul
echo %soursepart%
echo %soursename%
IF %allfile% GTR 4 set allfile=4
call :_normlvars "%var1%" "%var2%" "%var3%" "%var4%"
EXIT
Автор: wolf0425
Дата сообщения: 17.05.2007 09:48

Цитата:
Задача:
1. Переменная soursepart долна содержать имя_и_путь_папки в которой находятся выделенные объекты (в данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или D:\ , если объекты расположены в корне диска D.

так и непонятно - надо ли для soursepart анализировать весь список, или заведомо достаточно первой строки.
в смысле - что делать, если в последующих строках списка отличие более чем в последнем имени - и надо ли это отлавливать.
ну то есть не могут ли в списке оказаться одновременно строки
D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath1\
D:\DISTRIBUT 1\Winrar\1_7zSD_test\InstallPath2\
Автор: GORA2
Дата сообщения: 17.05.2007 10:10
wolf0425
Цитата:
надо ли для soursepart анализировать весь список..
....надо ли это отлавливать.
Нет и нет
Цитата:
Все выделенные объекты могут даходиться только в одной папке (В данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или в корне диска (например, D:\)
Т.е. папка у всех объектов в списке ОДНА и та же. Но все объекты (как вариант) могут быть расположены и корне диска.
Автор: wolf0425
Дата сообщения: 17.05.2007 10:30
GORA2 вызывает удивление срока
FOR /D %%a IN ("!tempi:~0,-1!.txt") DO (
в данном примере списка jна будет вызвана для
tempi=D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath\
а файл D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath.txt в постановке задачи не фигурирует.
как и файл D:\DISTRIBUT 1\7-Zip\1_7zSD_test.txt из последнего FOR
Автор: GORA2
Дата сообщения: 17.05.2007 10:41
wolf0425
Таким , возможно, корявым способом я получаю soursename, делая из папки псевдофайл.
Автор: wolf0425
Дата сообщения: 17.05.2007 11:30
GORA2 так кто и что в эти *.txt пишет? и зачем...
если только для разбора имени на части - то .txt приписывать совершенно незачем, пример был вчера
for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursename=%%~na"

оптимизировать с целью ускорения - не получится: всё однопроходное и много не наоптимизируешь.
А покороче можно и сделать, если надо.
Автор: GORA2
Дата сообщения: 17.05.2007 12:35
wolf0425
Цитата:
только для разбора имени на части - то .txt приписывать совершенно незачем, пример был вчера
for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursename=%%~na"
Недоглядел. Понял, попробую .
Цитата:
оптимизировать с целью ускорения - не получится: всё однопроходное и много не наоптимизируешь
Вам виднее. Я думал можно прекратить весь этот процесс после нахождения первых же четырех файлов в файл-списке т.к. мне более не требуется для обработки в _normlvars, а записей может быть значительно больше. Четырех файлов достаточно и для определения всех моих переменных.
Цитата:
А покороче можно и сделать, если надо.
Я бы не отказался , если Вас это не сильно обременит.


Автор: wolf0425
Дата сообщения: 17.05.2007 12:44
GORA2

Цитата:
Я думал можно прекратить весь этот процесс после нахождения первых же четырех файлов в файл-списке

1. можно, но неужели список настолько длинный, что это на что-то влияет? сколько строк в реальных списках?
2. подсчет общего количества строк - ты зачем-то ввел. или достаточно знать что их >1 ?
в принципе можно и отдельно (и быстро) посчитать все или остановить подсчет после четырех var - если в тот момент он уже потерял смысл (строк заведомо больше трех).
что лучше?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

Предыдущая тема: Автозагрузка терминальной сессии


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.