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

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

Автор: wolf0425
Дата сообщения: 07.05.2007 13:27
Maza Faka

Цитата:
найди там "а.tmpl", или запусти батник на своём комп

так откуда мне знать - модет у тебя на компе вообще ни одного *.tmpl нет.

твой батник, доработанный для облегчения проверки

@echo off
chcp 1251 > nul

del /q *.tmp
echo.>test1.tmp
echo.>test2.tmpl

Set LogPath=Log.txt
Set DelPath=.
Set Ext=*.tmp
CD "%DelPath%"
For /R %%i In (%Ext%) Do (
If "%Ext%"=="*.tmp" Del "%%i" /f /q
If Not Exist "%%i" (Echo %Time:~0,-3%^>^> File "%%i" was deleted>> "%LogPath%") Else (Echo %Time:~0,-3%^>^> File "%%i" was NOT deleted>> "%LogPath%")
)
пользователь ведь жаловался что У НЕГО *.tmpl тоже зачем-то удаляются и просил это пофиксить.
если у тебя
echo.>test2.tmpl
For /R %%i In (*.tmp) Do echo %%i %%~xi
не дает в лог test2.tmpl - значит у тебя просто в системе короткие имена отключены,
в отличие от моей и krukoff


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

так если специально написан обработчик того, что делать когда файл не удаляется (и пользователь на эту ветку не жалуется) - то вроде совершенно очевидно, что НЕ ВСЕ файлы пользователь собирается удалять, а только некоторые - которые легко удаляются. да и то оказывается не все.
а ты вместо чтения чего хотели и фикса проблемы - вписал условие эквивалентное If "2"=="2", кучу не относящихся к делу ключей и доказываешь что так и надо было удалять...
Автор: Maza Faka
Дата сообщения: 07.05.2007 13:37
wolf0425
Вот блин! Оказывается была запрещена генерация коротких имен! Исправил, рестартнул машину, работает, так, как ты писал! Сорри...
Так вроде тоже работает:

Код:
For /R %%i In (%Ext%) Do (
If "%%~xi"==".tmp" Del "%%i"
If Not Exist "%%i" (Echo %Time:~0,-3%^>^> File "%%i" was deleted>> "%LogPath%") Else (
@If "%%~xi"==".tmp" (Echo %Time:~0,-3%^>^> File "%%i" was NOT deleted>> "%LogPath%")
)
)
Автор: wolf0425
Дата сообщения: 07.05.2007 13:52
Maza Faka ну и ладно. замяли.
но если специально определили %ext% - не очень-то красиво потом использовать .tmp для условий, ибо переменная для того и вводится чтоб задавать расширение в одном месте батника.

2 krukoff если за всей дискуссией нить потерял - в итоге For должен быть таким

Код: For /R %%i In (%Ext%) Do (
if "*%%~xi"=="%Ext%" Del "%%i" & If Not Exist "%%i" (Echo %Time:~0,-3%^>^> File "%%i" was deleted>> "%LogPath%") Else (Echo %Time:~0,-3%^>^> File "%%i" was NOT deleted>> "%LogPath%" )
)
Автор: krukoff
Дата сообщения: 07.05.2007 14:07
Maza Faka

*.tmpl все равно удаляется мне этого не надо. Как сделать, чтобы удалялись лишь те файлы, которые я внесу в "маску" ? В общем, нужно удалять временные файлы по расширениям, которые я задам.


Код: @echo off
chcp 1251 > nul
setlocal
Set LogPath=C:\Log.txt
Set DelPath=C:\
set "mask=*.tmp *.tm"
CD "%DelPath%"
For /R %%i In (%mask%) Do (
If "%%~xi"=="*.tmp *.tm" Del "%%i"
If Not Exist "%%i" (Echo %Time:~0,-3%^>^> File "%%i" was deleted>> "%LogPath%") Else (
@If "%%~xi"=="*.tmp *.tm" (Echo %Time:~0,-3%^>^> File "%%i" was NOT deleted>> "%LogPath%")
)
)
Автор: wolf0425
Дата сообщения: 07.05.2007 14:09
krukoff что, и строка в мессаге перед последней твоей - не помогла?
она вроде не привязана к конкретному расширению и удаляет всё как надо - если в "маске" одно расширение и нет паразитных пробелов.
Автор: igor_andreev
Дата сообщения: 07.05.2007 14:20

Цитата:
*.tmpl все равно удаляется мне этого не надо.

DIR /B /S *.TMP | FIND /I /V ".TMPL"
Автор: wolf0425
Дата сообщения: 07.05.2007 14:23
igor_andreev хитрый какой.
но халява не бывает бесплатной - ведь кроме 1.TMPL.tmp который удалять надо есть ещё 2.tmp.tmp2 - который тоже удалять НЕ надо, а твой вариент не удовлетворяет обоим требованиям
Автор: igor_andreev
Дата сообщения: 07.05.2007 14:28
wolf0425
Я возможное направление дал, куда смотреть, а не конечное решение
DIR /B /S *.TMP | FIND /I /V ".TMPL" | FIND /I /V ".tmp.tmp2" ...продолжайте

Автор: wolf0425
Дата сообщения: 07.05.2007 14:34
igor_andreev
продолжать куда? напроавление то ты дал совершенно тупиковое:
внести в список ВСЕ возможные расширения будущих файлов, которые при конвертации в 8.3 также дадут .tmp - совершенно нереально, как и разрешить find пропускать строки с этими сочетаниями в середине имени.

как ни крути, а от пофайловой сравнивалки расширений никуда не денешься, а её уже написали до тебя
Автор: Maza Faka
Дата сообщения: 07.05.2007 14:37
krukoff
Специально создал несколько десятков файлов типа: "1r.tmp" "e34.tmpl" "2.tmp.tmp2" в разных каталогах на диске "C:\"
В итоге вот этот код работает, как надо:

Код:
@Echo off
chcp 1251 > nul
Set LogPath=C:\Log.txt
Set DelPath=C:\
Set Ext=*.tmp
CD "%DelPath%"
For /R %%i In (%Ext%) Do (
If "%%~xi"==".tmp" Del "%%i"
If Not Exist "%%i" (Echo %Time:~0,-3%^>^> File "%%i" was deleted>> "%LogPath%") Else (
@If "%%~xi"==".tmp" (Echo %Time:~0,-3%^>^> File "%%i" was NOT deleted>> "%LogPath%")
)
)
Автор: wolf0425
Дата сообщения: 07.05.2007 15:46
krukoff
Цитата:
Где я "напортачил" ?

вот так @If "%%~xi"=="*.tmp *.tm" работать не будет,
и чем думать как без глюков вписать проверку на подстроку - проще ещё цикл надстроить.

тебе по списку расширений пройтись надо? вот так сойдет? (пути поменяй по вкусу)

Код: @echo off
chcp 1251 > nul
setlocal enabledelayedexpansion

Set LogPath=.\Log.txt
Set DelPath=.
CD "%DelPath%"

for /f "tokens=1*" %%a in (%~s0) do if "%%a"=="#" For /R %%i In (*%%b) Do if /i "%%~xi"=="%%b" del "%%i" & if Not Exist "%%i" (Echo %Time:~0,-3%^>^> File "%%i" was deleted>> "%LogPath%") Else (Echo %Time:~0,-3%^>^> File "%%i" was NOT deleted>> "%LogPath%")

goto :eof

####    list of extension. No wildcards & spaces !
#    .tmp
#    .tmp2
#    .tm
Автор: igor_andreev
Дата сообщения: 07.05.2007 16:49

Цитата:
продолжать куда? напроавление то ты дал совершенно тупиковое

wolf0425
Ну кому тупиковое, а кто-то возможно включит соображалку, и вместо того, что вы тут расписываете третью страницу, напишет батник в одну строчку

for /f "tokens=*" %%a in ('dir /s /b *.tmp ^| findstr /i /e ".tmp"') do del /f /q "%%a"


Соображалку также можно заюзать и дальше, на предмет логирования и вставки времени, хотя это имхо явно лишнее, какая разница, удален файл в 21:22:45 или в 21:35:07 ? С трудом представляю себе админа или директора, внимательно читающего мегабайтный лог и устраивающего истерику по поводу того, что файл удален в 21:25, а не в 21:26 Достаточно вставить в начале батника:
echo %time% start task>log
а в конце соответственно stop task
Автор: Maza Faka
Дата сообщения: 07.05.2007 17:36
wolf0425

Цитата:
for /f "tokens=1*" %%a in (%~s0) do

А зачем нужно разбирать построчно текст батника?

Цитата:
For /R %%i In (*%%b) Do if /i "%%~xi"=="%%b" del "%%i"

И здесь не понятно, откуда взялась переменная %%b?

Добавлено:
igor_andreev

Цитата:
or /f "tokens=*" %%a in ('dir /s /b *.tmp ^| findstr /i /e ".tmp"') do del /f /q "%%a"

отличное решение!
Автор: 11100
Дата сообщения: 07.05.2007 21:48
одна программа запускается при старте системы,мне необходимо ,что б при запуски определенной программы первая(та ,что запускается при старте)закрывалась.можно ли это автоматизировать.
Автор: Elroir
Дата сообщения: 07.05.2007 21:52
11100
Можно. Делаешь такой батник:

Код:
taskkill /f /im program1.exe
program2.exe
Автор: NIKZZZZ
Дата сообщения: 08.05.2007 03:11
Есть такая задача - UsbFlashDisk (известна буква,например z:), нужно изменить политики

Свойства->оборудование->нужное устройство->свойства->политики:
Oптимизиpoвaть для быcтpoгo удaлeния ->Oптимизиpoвaть для выпoлнeния ->Ok

Решаема ли задача батником?
Тупое изменение ключей реестра эфекта не дает.

P.S. я не вставлял смайлик !!!
Автор: Elroir
Дата сообщения: 08.05.2007 03:16
NIKZZZZ

Цитата:
я не вставлял смайлик !!!

Нажми "Редактировать" и убери галочку с "Разрешить смайлики?".
Автор: Gabzya
Дата сообщения: 08.05.2007 08:00
млин, какой то батник неправильный все же, уже неделю работает, но 0 результата....

Добавлено:
@echo off
setlocal enabledelayedexpansion
chcp 1251 > nul

set first_symb=і
set second_symb=ї
set third_symb=І
set forth_symb=Ї

:rendir
for /f "tokens=*" %%a in ('dir /b /a:d /s') do (
set dirname=%%a
set dirname=!dirname:%first_symb%=1!
set dirname=!dirname:%second_symb%=2!
set dirname=!dirname:%third_symb%=3!
set dirname=!dirname:%forth_symb%=4!
move "%%a" "!dirname!" 2>nul | find /i "перемещено" && goto rendir
)

:renfiles
for /f "tokens=*" %%a in ('dir /b /a:-d /s') do (
set filename=%%~nxa
set filename=!filename:%first_symb%=1!
set filename=!filename:%second_symb%=2!
set filename=!filename:%third_symb%=3!
set filename=!filename:%forth_symb%=4!
ren "%%a" "!filename!"
)
Автор: wolf0425
Дата сообщения: 08.05.2007 09:14
Maza Faka

Цитата:
А зачем нужно разбирать построчно текст батника?

потому что в последние три строки батника вписан легкоредактируемый список тех расширений, которые надо удалять с логом. Можно конечно отдельный файл-список завести, но прямо в хвост (вообще-то в любое место) батника вписать - удобнее и переносимее получается.
А как передавать список расширений без файла, через переменную, как в оригинале - у меня что-то идей нет.

Цитата:
И здесь не понятно, откуда взялась переменная %%b?

очевидно же - предыдущий цикл for /f "tokens=1*" %%a
определяет две переменные - %%a и %%b


Цитата:
отличное решение!

угу, красивое. вот только ничуть не быстрее и для списка расширений всё равно городить ещё цикл.
и пофайловое выпендрежное логирование (не)успешных удалений у krukoff займет в батнике больше места, чем собственно удаление/проверка...
Автор: Maza Faka
Дата сообщения: 08.05.2007 09:35
wolf0425

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

Я так и подумал вначале, но меня смутили символы # решил, что батник споткнётся на них, а так решение ничего, оригинальное!
Автор: wolf0425
Дата сообщения: 08.05.2007 12:21
Gabzya

Цитата:
уже неделю работает, но 0 результата....

а какой ты ожидал результат? в смысле - чего батник не переименовал тебе так, как тебе надо?
или ты его запустил в c:\ неделю назад, он с тех пор работает - но до интересных тебе файлов не дошел?!??
Автор: Maza Faka
Дата сообщения: 08.05.2007 13:13
wolf0425

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

Ему надо заменить украинские символы "i" и "ї"на "и" и "йы", мы с Tipulatoid-ом помогли ему написать батник, а он у него не работает ни в каких кодировках, правда насчёт недели я тоже не понял...
Автор: wolf0425
Дата сообщения: 08.05.2007 13:34

Цитата:
мы с Tipulatoid-ом помогли ему написать батник

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

ps: а батник - кривой до невозможности, на каждую неправильную буковку в имени каталога делает его переименование и полное пересканирование всего дерева - что и действительно при запуске на c:\ фиг знает сколько времени займёт...
но неделя - как-то всё равно черезчур

разве что - какой-то "неправильный" каталог залочен и не дает себя переименовать...
Автор: Elroir
Дата сообщения: 08.05.2007 13:59
wolf0425

Цитата:
а батник - кривой до невозможности

Предложи свой вариант
Автор: wolf0425
Дата сообщения: 08.05.2007 14:02

Цитата:
Предложи свой вариант

в процесе написания. больше всего мне мешают идейные непонятки
1. нафига оно мне вообще надо
2. а всё-таки - в какие буквы надо переименовывать "і" и "ї"
Автор: Elroir
Дата сообщения: 08.05.2007 14:07
wolf0425

Цитата:
1. нафига оно мне вообще надо

Для интереса . Ну и показать как правильно - чтобы другие научились.

Цитата:
2. а всё-таки - в какие буквы надо переименовывать "і" и "ї"

Это к Gabzya
А... вот:

Цитата:
Ему надо заменить украинские символы "i" и "ї"на "и" и "йы"

Автор: wolf0425
Дата сообщения: 08.05.2007 14:34

Цитата:
Ему надо заменить украинские символы "i" и "ї"на "и" и "йы"

"йы" - так буквально и пишется? А в верхнем регистре?
Автор: Elroir
Дата сообщения: 08.05.2007 14:40
wolf0425
"йы" - видимо так и пишется. А насчет верхнего регистра - хороший вопрос, тут могут быть варианты.
Автор: slayer120
Дата сообщения: 08.05.2007 16:03
Стоит задача - копировать с разных компов файлы бакапов (.bkf)
на один сервак. Надо, естественно выбирать последние по дате.
В связи с этим вопросы:
1. Надо ли мапить сетевые диски ,т.е. будет ли for обрабатывать bnc пути?
2. Дописать в имя копируемого файла время.
3. Собственно как работать с временем создания файлов(можно сравнивать и т.п.)?

ps
wolf0425

Цитата:
да в общем-то одного DT на все форматы образов как раз и хватает

А например vcd образы он читает разве?
Автор: wolf0425
Дата сообщения: 08.05.2007 16:15
slayer120
1. с bnc путями замечательно работает dir, вот её в for /f и вписать - заодно отсортирует
2. переменная %time% тебе зачем дана?
или ты про время файлов - тогда см @for /r %a in (*.cmd) do @echo %~nxa - %~ta
3. а оно тебе надо - самому время/дату сравнивать? попросить dir отсортировать и взять nn первых - недостаточно?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

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


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