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

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

Автор: mugil_cephalus
Дата сообщения: 09.06.2010 09:47
AkeHayc

Цитата:
dsadd contact CN=%%a,%ou%" -fn %%b" -ln "%%c"

может, так
dsadd contact CN=%%a,%ou% -fn "%%b" -ln "%%c"
Автор: dvymp4
Дата сообщения: 09.06.2010 11:49
Подскажите пожалуйста, как можно проверить наличие файлов в каталоге?
использование if exist dir\*.* не приносит желаемого результата - в случае пустого каталога результат все равно положительный.

трудность в том, что файлы могут быть с любой маской (с расширением и без, с произвольной длиной имени), обработка вывода команды "DIR" занимает очень много времени, т.к. каталогов более 1000 и во многих порядка 20000 файлов.

Спасибо.
Автор: Mark_Titov
Дата сообщения: 09.06.2010 11:50
wolf0425 Подскажи плиз как убрать вывод на экран ошибки при не обнаружении файла указанного в этом параметре -

Код: set /p site=<%systemdrive%\IP-AN-80.txt && goto :ping-ok
Автор: AkeHayc
Дата сообщения: 09.06.2010 12:00
Вот что у меня вылазит:

C:\>(dsadd contact CN=????????,OU=adressbook,DC=COMPANY,DC=LOCAL" -fn ,??????
? ??????????" -ln ",???????? ??????? ??????????" -display ",???.????????" -title
",258-44-44 266-44-44 ??. " -tel ",8 777 370 76 06" -mobile "," -email ",
21231" -office ",258-42-59" -fax ",227 89 91" -hometel "%k" )
dsadd failed:Value for `Target object for this command' has incorrect format.
type dsadd /? for help.
C:\>(dsadd contact CN=???????????,OU=adressbook,DC=ASIAINVEST,DC=local" -fn ,???
???? ??????????" -ln ",??????????? ??????? ??????????" -display ",???.???????? A
LA" -title ",258-44-44 266-44-44 ??. " -tel ",8 777 278 04 19" -mobile ","
-email ",21135" -office ",258-42-59" -fax ",238 05 47" -hometel "%k" )
dsadd failed:Value for `Target object for this command' has incorrect format.
Автор: wolf0425
Дата сообщения: 09.06.2010 12:08

Цитата:
Подскажите пожалуйста, как можно проверить наличие файлов в каталоге?
использование if exist dir\*.* не приносит желаемого результата - в случае пустого каталога результат все равно положительный.

dir /b dir\* 2>nul |find /v "" >nul && echo files or dirs exists
в ключи дира можно дописать выборку конкретно файлов, а не директорий. или наоборот...


Цитата:
трудность в том, что файлы могут быть с любой маской (с расширением и без, с произвольной длиной имени), обработка вывода команды "DIR" занимает очень много времени, т.к. каталогов более 1000 и во многих порядка 20000 файлов.
в в каких многих? или конкретно в каталоге dir\ столько файлов ?

Добавлено:
AkeHayc

Цитата:
Вот что у меня вылазит:
C:\>(dsadd contact CN=????????,

ну, и в какой кодировке у тебя c.csv ?
ты батник то на ту же кодировку переключил?
Автор: AkeHayc
Дата сообщения: 09.06.2010 12:16
wolf0425
DOS, если в Win кодировке бабахнуть в AD получаются крякозябры, в DOS все пучком, проверил.

Добавлено:
wolf0425
В принципе простой батник работает с тремя значениями, но если добавить другие, получается каша.
Автор: res2001
Дата сообщения: 09.06.2010 12:20
dvymp4
Вместо if exist используй for. Внутри for выполняй операции в случае наличия файлов в каталоге, в конце fora - goto на выход из цикла.
Автор: wolf0425
Дата сообщения: 09.06.2010 12:24

Цитата:
если в Win кодировке бабахнуть в AD получаются крякозябры, в DOS все пучком, проверил.
почему-то мне кажется что если и файлик и батник во время выполнения оба будут в вин - то тоже всё будет пучком. но если оно как-то работает с двумя параметрами - дело действительно не в кодировке.

А где у тебя ошибка - не видно же ни черта, откуда у тебя ???? лезут если файлик тоже в ДОС? ты бы фонт консоли на люсиду переключил, что-ли, вдруг что увидим.

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

и я бы писал как-то так:
dsadd contact "CN=%%~a,%ou%" -fn "%%~b" -ln "%%~c"
Автор: dvymp4
Дата сообщения: 09.06.2010 13:12
to wolf0425

Цитата:
dir /b dir\* 2>nul |find /v "" >nul && echo files or dirs exists
в ключи дира можно дописать выборку конкретно файлов, а не директорий. или наоборот...

в в каких многих? или конкретно в каталоге dir\ столько файлов ?


Много каталогов DIR, т.е. DIR0001, DIR0002 .... DIR1000.
Они перебираются в цикле. В каждом может быть от 0 до "очень много файлов". Я сечас посмотрел в самом большом более 50000. Надо найти пустые. Обработку DIR я делать пробобовал, но на больших каталогах это занимает очень много времени. Хочу оптимизировать процесс.

to res2001

Цитата:
dvymp4
Вместо if exist используй for. Внутри for выполняй операции в случае наличия файлов в каталоге, в конце fora - goto на выход из цикла.


Т.е. получиться примерно так?

FOR %%I IN (DIR\*.*) DO (
ECHO File exist
goto :END)
:END
Автор: res2001
Дата сообщения: 09.06.2010 13:35
dvymp4
да именно так.
Если понадобится обрабатывать случаи, когда файлов нет, то делай примерно так:

Код: set FEXIST=false
FOR %%I IN (DIR\*.*) DO (
ECHO File exist
set FEXIST=true
goto :END)
if %FEXIST%==false (
команды для случая отсутствия файлов
)
:END
Автор: wolf0425
Дата сообщения: 09.06.2010 13:39

Цитата:
Т.е. получиться примерно так?

FOR %%I IN (DIR\*) DO goto :File_exist
:file_not_exist
Автор: res2001
Дата сообщения: 09.06.2010 13:46
wolf0425
точно
Автор: dvymp4
Дата сообщения: 09.06.2010 13:51
to res2001
to wolf0425
Спасибо!

А вообще, более быстрый способ подсчета файлов в каталоге, чем анализ результата DIR существует?
Автор: Mark_Titov
Дата сообщения: 09.06.2010 14:09
wolf0425

Цитата:
предварительно проверить существование файла.

А по другому ни как?
Автор: res2001
Дата сообщения: 09.06.2010 14:10
dvymp4
Думаю что нет, особенно при таком количестве файлов как у тебя.
Можешь в том же forе посчитать и сравнить производительность.
Автор: ComradG
Дата сообщения: 09.06.2010 16:31

Цитата:
Подскажи плиз как убрать вывод на экран ошибки при не обнаружении файла указанного в этом параметре

попробуй в конец строки поставить что-то вроде
findstr /i noone
То есть должно получиться так

Код: set /p site=<%systemdrive%\IP-AN-80.txt && goto ing-ok | fondstr /i noone
Автор: wolf0425
Дата сообщения: 09.06.2010 18:16
Mark_Titov
Цитата:

Цитата: предварительно проверить существование файла.

А по другому ни как?
Автор: Mark_Titov
Дата сообщения: 09.06.2010 18:19
ComradG, спасибо но не канает...

Добавлено:

Цитата:
. а чем так плохо проверять?
2. а по другому - идеологически невыдержанно. хотя и можно:
wolf0425, Вот! Супер - канает! Как всегда спасибо!
Автор: yurkesha
Дата сообщения: 09.06.2010 18:25
wolf0425
Наверное правильнее чем
Код: find /c
Автор: wolf0425
Дата сообщения: 09.06.2010 18:31
yurkesha
Цитата:
Наверное правильнее

на самом деле это выглядит примерно так:
Код: for /f %%a in ('dir /b /a-d c:\mydir\ ^| find /c /v "" ') do set "FilesInMydir=%%a"
Автор: WesternLight
Дата сообщения: 09.06.2010 18:36

Цитата:
date /t| 1>>Logs\consupdate.%startdate%.log "%MyFiles%\iconv.exe" -c -s -f 866 -t WINDOWS-1251


NIKZZZZ, wolf0425, спасибо за помощь! Не знал, что можно так записывать... Я никак не разберусь с этими дескрипторами... не могу понять как их использовать, в голове не укладывается


Цитата:
WesternLight а ради чего такое извращение то?


wolf0425, какое именно? Это "%MyFiles%\iconv.exe" -c -s -f 866 -t WINDOWS-1251?
Автор: wolf0425
Дата сообщения: 09.06.2010 18:44

Цитата:
wolf0425, какое именно? Это "%MyFiles%\iconv.exe" -c -s -f 866 -t WINDOWS-1251?
именно. переключить консоль в 1251 кодировку и выкинуть iconv нафиг - какие-то проблемы?
тем более что и в примере и date /t и time /t вообще букв не выводят ни в какой кодировке, только цифры - зачем их то перекодировать?
да и текст батника в 1251 по нынешним временам комфортнее редактировать...


Добавлено:

Цитата:
Я никак не разберусь с этими дескрипторами... не могу понять как их использовать, в голове не укладывается
в hh ntcmds.chm почитай redirecting command output, redirection overview
Автор: yurkesha
Дата сообщения: 09.06.2010 19:06
wolf0425
Я не это имел в виду - команда DIR без указания /b выводит в последних двух строках суммарное количество файлов и папок. Не будет ли быстрее работать если найти эти строки при помощи find и отпарсить результат? На больших объемах это может быть критично...
Автор: WesternLight
Дата сообщения: 09.06.2010 19:11

Цитата:
переключить консоль в 1251 кодировку и выкинуть iconv нафиг - какие-то проблемы?


wolf0425, т.е. я могу писать батник в 1251, все сообщения на русском в окно консоли будут выводится корректно и все сообщения в лог тоже, я правильно понимаю? И все это будет работать и на Win 2000?
Автор: wolf0425
Дата сообщения: 09.06.2010 19:26

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

у меня 100к файлов find /с считает ~2.4 секунды, а парсинг с выдиранием готового количества
Код: for /f %%a in ('dir /a-d test\ ^| findstr /b /c:" " ') do if not defined FilesInMydir1 set "FilesInMydir1=%%a"
Автор: Mark_Titov
Дата сообщения: 09.06.2010 19:31
wolf0425
Не большой косячок вылез - не то что бы критично конечно, но хотелось бы уж до ума довести это...
Припервом запуске батника он по условию указанному здесь -

2>nul MD "%systemdrive%\AN-80\%mes%\" && goto :htm


Код: :ping-ok
set "mes=%date:~-7%"
2>nul MD "%systemdrive%\AN-80\%mes%\" && goto :htm
2>nul MD "%systemdrive%\AN-80\%mes%\%date%"
set "Log=%systemdrive%\AN-80\%mes%\%date%\log.txt"
1>nul 2>&1 MD "%systemdrive%\AN-80\%mes%\%date%"
set "Log=%systemdrive%\AN-80\%mes%\%date%\log.txt"
for /f "tokens=2 delims=()" %%a in ('ping -n 4 %site%') do 1>>%log% echo.%date% %time:~,8% %%a
for /f "tokens=3 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\%date%\log.txt) do set /a day_sum += %%a*100 & set /a day_count += 1
set /a day_average=(%day_sum%)/(%day_count%) +10000
set /a day_average_int = %day_average:~0,-2% -100
1>%systemdrive%\AN-80\%mes%\Monthly-report.txt echo.СРЕДНЕ-АРИФМЕТИЧЕСКИЙ ПРОЦЕНТ ПОТЕРИ СВЯЗИ ЗА %mes%
1>>%systemdrive%\AN-80\%mes%\Monthly-report.txt echo --------------------------------------------------------------------------
1>>%systemdrive%\AN-80\%mes%\Monthly-report.txt echo.
1>%systemdrive%\AN-80\%mes%\%date%\Daily-report.txt echo Средне-арифметический процент потери связи за %date% составил - %day_average_int%.%day_average:~-2%%%
for /f "delims=" %%a in ('dir /b /s %systemdrive%\AN-80\%mes%\Daily-report.txt') do type %%~fa 1>> %systemdrive%\AN-80\%mes%\Monthly-report.txt
for /f "tokens=9 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\Monthly-report.txt) do set "mes_tmp=%%a" & set /a mes_count += 1 & call set /a mes_sum += %%mes_tmp:.=%%
set /a mes_average=(%mes_sum%)/(%mes_count%)+10000
set /a mes_average_int=%mes_average:~0,-2%-100
set mes_
1>> %systemdrive%\AN-80\%mes%\Monthly-report.txt (
echo.
echo --------------------------------------------------------------------------
echo Средне-арифметический процент потери связи за %mes% составляет - %mes_average_int%.%mes_average:~-2%%%
)
sleep 300
goto :ping
Автор: wolf0425
Дата сообщения: 09.06.2010 19:55

Цитата:
wolf0425, т.е. я могу писать батник в 1251, все сообщения на русском в окно консоли будут выводится корректно и все сообщения в лог тоже, я правильно понимаю? И все это будет работать и на Win 2000?
фонт консоли (в заголовке окна или в ярлыке) на уникодный переключаешь - и корректные русские сообщения корректно видишь и в 866 и в 1251. уникодный - это например люсида, хотя некоторые запали на consolas

А все программы выдают вывод (в консоль или в лог) в той кодировке, которая установлена последней командой chcp NN (при отсутствии такой команды - в той, что в системе по умолчанию, т.е OEM/дос обычно)


Код: echo off
chcp 1251 >nul
1>>Logs\consupdate.%startdate%.log (
date /t
time /t
echo русский текст в 1251 кодировке
)
type "c:\русский_файл.txt"
Автор: WesternLight
Дата сообщения: 09.06.2010 19:58

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


прикольно, работает... но вот переключать на 30 машинах у меня нет возможности, можно ли как-то установить шрифт по умолчанию из моего же батника? может импортом в реестр чего-то?
Автор: wolf0425
Дата сообщения: 09.06.2010 20:10

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

а вообще - наверно это HKEY_CURRENT_USER\Console
только там к фонту много настроек, так что чего-то типа такого

Код: [HKEY_CURRENT_USER\Console]
"ScreenBufferSize"=dword:00190050
"WindowSize"=dword:00190050
"FontSize"=dword:00120000
"FontFamily"=dword:00000036
"FontWeight"=dword:00000190
"FaceName"="Lucida Console"
"CursorSize"=dword:00000019
Автор: WesternLight
Дата сообщения: 09.06.2010 21:20

Цитата:
а вообще - наверно это HKEY_CURRENT_USER\Console
только там к фонту много настроек, проверять что реально надо переносить - мне пока лень.


да, я уже нашел, вот содержание reg-файла, кому-нибудь пригодится:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"FaceName"="Lucida Console"
"FontSize"=dword:00100000
"FontFamily"=dword:00000036
"FontWeight"=dword:00000190

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

Предыдущая тема: XP не видит второй раздел на съемном USB-HDD


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