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

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

Автор: ViSiToR
Дата сообщения: 28.02.2007 06:39
igor_andreev

Цитата:
а народ в это время из под XP Home или Win 2000 безуспешно пытается встроенный справочник по командной строке открыть.

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

Elroir

Цитата:
У нас (если я правильно понимaю, где находится ViSiToR) 6 утра

А где я нахожусь? , у меня да, 6:39
Автор: ipmanyak
Дата сообщения: 28.02.2007 15:32

Автор: drondo
Дата сообщения: 28.02.2007 19:13
Elroir

Цитата:
Все верно, кроме того, что dir /od сортирует по дате модификации, а не создания файлов. Кроме того можно обойтись без счетчика:

а как будет полностью код выглядеть? куда встявлять и что заменить твоим кодом?
Автор: Elroir
Дата сообщения: 28.02.2007 20:01
drondo

Код:
@echo off
setlocal
set source=//server
for /f "usebackq tokens=*" %%a in (`dir %source% /a-d /od /b /tc`) do set file_to_copy=%%a
copy /y "%source%\%file_to_copy%" > nul
start /b "" "%file_to_copy%"
Автор: drondo
Дата сообщения: 28.02.2007 21:08
Спасибо большое,завтра на работе проверю и отпишусь.
А если в пути или в имени кирилица присутствует работать будет?
Автор: Elroir
Дата сообщения: 28.02.2007 21:40
drondo

Цитата:
А если в пути или в имени кирилица присутствует работать будет?

Не вижу причин, по которым может не работать. На всякий случай, в строчке for-а возьми в кавычки %source%.
Автор: Tipulatoid
Дата сообщения: 01.03.2007 03:02
all
Здесь Ysan предложила задачку, которая мне показалась интересной.

Подсчет строк - задача тривиальная; для подсчета символов я взял код igor_andreev который он здесь приводил по другому поводу (хотя, наверное, можно и проще сделать - узнать размер текстового файла и отнять символы возврата каретки, перевода строки и конца файла) А вот подсчитать кол-во слов - тут я не знаю как. Надо, наверное, подсчитать кол-во пробелов в файле и от этого числа плясать, да как это сделать?

Код: @echo off
if "%~1"=="" (
echo Не задан текстовый файл для анализа
goto end)

set file=%~1

::Выяснение кол-ва символов
set symbols_quantity=0
for /f "tokens=*" %%a in (%file%) do call :temp_file "%%a"
goto next_label

:temp_file
echo.%1>line#.tmp
for %%a in (line#.tmp) do set /a "line_length=%%~za-4"
set /a symbols_quantity=%symbols_quantity%+%line_length%
goto :eof

:next_label
del /q line#.tmp
echo Всего символов в файле %file%: %symbols_quantity%


::Выяснение кол-ва строк
setlocal enabledelayedexpansion

:: Выяснение кол-ва непустых строк
set counter=0
for /f "tokens=*" %%a in (%file%) do (
set /a counter=!counter!+1)

:: Выяснение кол-ва пустых строк
set count=0
for /f "tokens=*" %%a in ('findstr /r /v /n "." %file%') do (
set /a count=!count!+1)

:: Выяснение общего кол-ва строк
set /a line_quantity=%counter%+%count%

echo Всего строк в файле %file%: %line_quantity%

:end
Автор: igor_andreev
Дата сообщения: 01.03.2007 03:38

Цитата:
Надо, наверное, подсчитать кол-во пробелов в файле и от этого числа плясать, да как это сделать?

Это test.cmd

Код:
@ECHO OFF & SETLOCAL

SET "cnt=0"
CALL :tokcnt Warning SSL not supported by remote system for data link
PAUSE & GOTO :EOF

:tokcnt
if NOT "%~1"=="" SET /A cnt+=1 & SHIFT & GOTO :tokcnt
ECHO [%cnt%]%*
SET "cnt=0"
Автор: Elroir
Дата сообщения: 01.03.2007 05:27
Tipulatoid
Задачка совсем не тривиальная. С количеством строк и символов проблем нет, а вот с количеством слов - огромные. Как сказал igor_andreev:

Цитата:
если в строчке знаки перенаправления > или еще что такое попадется(а оно попадется ),

А кроме того, если в строке есть разные комбинации символов, вроде "= =" - это вообще улет . В качестве параметра командной строки, символ "равно" просто не виден. И есть очень много подобных сложностей.
P.S. Кстати, откуда взялась цифра 4, которая отнимается от длины строки?
Автор: Tipulatoid
Дата сообщения: 01.03.2007 05:59
igor_andreev
Если честно, не разобрался я Не дорос еще до такого кода.
Также подумал, что для той задачи подсчитать кол-во пробелов - не выход, т.к. слово может быть отделено и 2-мя и 3-мя и сколько хошь пробелами.
Решил полностью задачу Ysan Надеюсь, она сюда заглянет. Знаю, что коряво - создает темповые файлы, допускает не более 26 слов в строке, опять же проблемы со спецсимволами (но тут похоже можно обойти - просто записывать слова в temp.txt в кавычках) и долго на больших файлах, но как умею


Код: @echo off
setlocal enabledelayedexpansion

if "%~1"=="" (
echo Не задан текстовый файл для анализа
goto end)

set file=%~1

::Выяснение кол-ва слов
for /f "tokens=1-26 delims= " %%a in (%file%) do (
(
echo %%a
echo %%b
echo %%c
echo %%d
echo %%e
echo %%f
echo %%g
echo %%h
echo %%i
echo %%j
echo %%k
echo %%l
echo %%m
echo %%n
echo %%o
echo %%p
echo %%q
echo %%r
echo %%s
echo %%t
echo %%u
echo %%v
echo %%w
echo %%x
echo %%y
echo %%z
)>>temp.txt
)

findstr /r /v "Режим вывода команд на экран (ECHO) отключен." temp.txt>words.del
del /q temp.txt

set counter=0
for /f "tokens=*" %%a in (words.del) do (
set /a counter=!counter!+1)

del /q words.del
set words_quantity=%counter%

::Выяснение кол-ва строк
::Выяснение кол-ва непустых строк
set counter=0
for /f "tokens=*" %%a in (%file%) do (
set /a counter=!counter!+1)

::Выяснение кол-ва пустых строк
set count=0
for /f "tokens=*" %%a in ('findstr /r /v /n "." %file%') do (
set /a count=!count!+1)

::Выяснение общего кол-ва строк
set /a line_quantity=%counter%+%count%


::Выяснение кол-ва символов
::Выяснение размера текстового файла
for %%a in (%file%) do set /a "file_length=%%~za"

::Выяснение кол-ва непечатаемых символов в конце каждой строки
set /a invisible_symbols=2*%line_quantity%

::Вычет невидимых символов от размера файла
set /a symbols_quantity=%file_length%-%invisible_symbols%-1

echo Всего символов (вместе с пробелами) в файле %file%: %symbols_quantity%
echo Всего слов в файле %file%: %words_quantity%
echo Всего строк в файле %file%: %line_quantity%

:end
Автор: NIKZZZZ
Дата сообщения: 01.03.2007 09:57
Elroir

Цитата:
Задачка совсем не тривиальная. С количеством строк и символов проблем нет, а вот с количеством слов - огромные.

Самое простое - передать строку другому батнику, а он посчитает к-во переданных аргументов (слов).
******************
@echo off
set /a n=0
:_1
if "%1"=="" goto _2
set /a n=n+1
echo %1
shift
goto _1
:_2
Echo %n% words.
pause
******************

Автор: Elroir
Дата сообщения: 01.03.2007 18:06
NIKZZZZ

Цитата:
Самое простое - передать строку другому батнику, а он посчитает к-во переданных аргументов (слов).

Все не так просто - допустим в переданной батнику строке есть два слова в кавычках:
"один два". При этом они будут посчитаны не как 2 слова, а как одно. И снова повторю - если в строке есть спец. символы - будут проблемы.

Tipulatoid
Критикую:

Цитата:
допускает не более 26 слов в строке



Автор: drondo
Дата сообщения: 01.03.2007 19:46
Elroir
не сработал батник. Тот где на сетевом диске найти новый файл и открыть его. после запуска в консоли пишет "не найден сетевой путь" или что то в этом роде.
Пробовал слэши на бекслеши поменять перед server, результат такой же. Netbios работает, через проводник в эту папку заходит. Путь копировал из строки адреса в проводнике. Что еще может быть причиной?
Автор: Elroir
Дата сообщения: 02.03.2007 00:29
drondo
Я на самом деле не проверял как он работатет - просто вставил свою часть в код, который написал Tipulatoid.
Вот так должно работать:

Код:
@echo off
setlocal
set "source=\\server\path to\network folder"
for /f "usebackq tokens=*" %%a in (`dir "%source%" /a-d /od /b /tc`) do set file_to_copy=%%a
copy /y "%source%\%file_to_copy%" > nul
start /b "" "%file_to_copy%"
Автор: vbugay
Дата сообщения: 02.03.2007 11:14
кто поможет я не силён в этом а ручками долго там лишь только опечатка не в 7 строке а в 17 инн
http://forum.ru-board.com/topic.cgi?forum=33&topic=8043&start=0#3
Автор: igor_andreev
Дата сообщения: 02.03.2007 11:54
vbugay
Стопудово поможет кто-нибудь , задача особой сложности не представляет ни для батника, ни для скрипта. Только ты бы привел для наглядности один типовой файл из этих пяти тысяч с 1-й по 18-ю строку. Еще нужно знать - свалены они в одной папке или и по подпапкам разбросаны(рекурсию применять или нет). И обрабатывать все подряд файлы *.* или с определенным расширением(может еще какие ненужные файлики в этой папке есть).

Добавлено:
Еще желательно(на всяк. случай) знать, какого плана названия у файликов, типа например 877_OOJU22.EXT или "Wow & гип-гип !! Жырик рулит(@).ext"
Автор: jawAka
Дата сообщения: 02.03.2007 13:23
без обхода спецсимволов

@echo off
setlocal enabledelayedexpansion
if exist иннren.txt del иннren.txt
For %%b in (иннотчет*.txt) do (
    (set inn=)
    (set kname=)
    for /f "usebackq skip=16 tokens=*" %%a in ("%%b") do if "!inn!"=="" (set inn=%%a)
    for /f "usebackq skip=2 tokens=*" %%a in ("%%b") do if "!kname!"=="" (set kname=%%a)
    echo "%%b"{!inn!}!kname!>>иннren.txt
)
rem for /f "delims={} tokens=1,2,3" %%a in (иннren.txt) do ((if not exist "%%b\" md %%b) & copy %%a "%%b\*.*" )


иннотчет*.txt - маска отчётов в текущей директории
иннren.txt вспомогательный файл - посмотрите его, формат:"название файла"{ИНН}Наименование конторы
Всё понравится - ремарку снимите в коде...
Автор: kabolt
Дата сообщения: 02.03.2007 14:16
итак

задача такая. надо создать два батника, так, чтобы при запуске первого темп становился стандартным типа "c:\\temp", а при запуске второго, темп переназначался в другое место, например "s:\\temp" где s:\\- секретный раздел или флешка. делаецца это для того, чтобы при работе с отдельными приложениями, в винте ничего не кешировалось.

я сделал обычный батник:
mkdir c:\temp
set TEMP c:\temp
и аналогичный с диской "s:\\", но пока я физически не захожу в "переменные среды" в "моем компе" изменения не вступают в силу, а мне надо чтобы это работало оперативно...

как быть?

в идеале было бы сделать скрипт, который по событию (например отключению диска) тер бы темп ну и наоборот
Автор: igor_andreev
Дата сообщения: 02.03.2007 14:31
kabolt
Тебе нужны консольные SETX.EXE или SETENV.EXE или записывать в реестр в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment или в ветку для текущего юзера HKCU\Environment, и в зависимости от того, где-что изменил или
rundll32 user32.dll, UpdatePerUserSystemParameters
или
NIRCMDC.EXE sysrefresh environment

Все *.exe гугль находит легко
Автор: Elroir
Дата сообщения: 02.03.2007 15:06
kabolt
Посмотри - http://forum.ru-board.com/topic.cgi?forum=62&topic=9040&start=660#17
Автор: kabolt
Дата сообщения: 02.03.2007 15:33
Elroir

спасибо. все получилось

Reg Add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" /v TEMP /t REG_SZ /d "s:\temp" /f

Reg Add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" /v TMP /t REG_SZ /d "s:\temp" /f

Reg Add "HKEY_CURRENT_USER\Environment" /v TMP /t REG_SZ /d "s:\temp" /f

Reg Add "HKEY_CURRENT_USER\Environment" /v TEMP /t REG_SZ /d "s:\temp" /f
Автор: Ysan
Дата сообщения: 02.03.2007 16:14
сижу разбираюсь со своей задачкой по подсчету слов... Спасибо за помощь.
А кто может подробно пояснить про назначение и применение tokens и delims?
Автор: ViSiToR
Дата сообщения: 02.03.2007 17:19
Ysan

Цитата:
кто может подробно пояснить про назначение и применение tokens и delims?

Справка


Цитата:
delims=xxx - определение набора разделителей для замены заданных по умолчанию пробела и знака табуляции.



Цитата:
tokens=x,y,m-n - определение номеров подстрок, выделяемых из каждой
строки файла и передаваемых для выполнения в тело
цикла. При использовании этого ключа создаются
дополнительные переменные. Формат m-n представляет
собой диапазон подстрок с номерами от m по n. Если
последний символ в строке tokens= является
звездочкой, создается дополнительная переменная,
значением которой будет весь оставшийся текст в
строке после обработки последней подстроки.
Автор: drondo
Дата сообщения: 02.03.2007 19:18
Elroir
спасибо огромное, все работает! Теперь гораздо проще новые приказы искать, точнее их вообще не надо искать!
Автор: cluster
Дата сообщения: 03.03.2007 13:16
Помогите поправить код
Есть консольная утилитка, преобразующая файлы BMP в GPF. Её команда такая:

Цитата:
bmp2gpf.exe -n файл1.bmp имя_файла1_без_расширения файл2.bmp имя_файла2_без_расширения ...

Меня даже устраивает по одному обрабатывать. Т.е.
bmp2gpf.exe -n файл1.bmp имя_файла1_без_расширения
bmp2gpf.exe -n файл2.bmp имя_файла2_без_расширения
...

Код такой, но не работает:

Код: @ECHO OFF

FOR %%A IN (*.BMP) DO (
CALL :NAME %%A
CALL :START %%A
)
GOTO :EOF

:START
bmp2gpf -n %%A %name%
GOTO :EOF


:NAME
FOR /F %%I IN ('dir *.BMP /B %%q') do set name=%%~ni
GOTO :EOF
Автор: Elroir
Дата сообщения: 03.03.2007 13:24
cluster

Код:
@echo off
for %%a in (*.bmp) do (bmp2gpf.exe -n %%a %%~na)
Автор: cluster
Дата сообщения: 03.03.2007 16:09
Elroir
Ого! Оказывается всё так просто. Огромное спасибо.
Автор: CrackMe
Дата сообщения: 04.03.2007 17:13
нужно зделать срузу и много (ос - Виста, но в наличиии нет - рабоать прдется в слепую):
во превых жедательно определить запущен ли батник с правами админа, и сели нет сообщить о том , что это не допустимо.
Во вторых надо остановить службу User Account Control
я хочу сделать это так:
[сode]net stop User Account Control[/code]
в третьих:
нужно установить драйвер (батник будет в той же папке , что и .inf от дров):
[сode]rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 InstallDriver.inff1[/code]
в четвертых:
рестарт (вс дальнейшие действия можно в принцип е поместить в отдельный батник, если оч. сложно начать выполнеиня батника с места рестарта)
в пятых:
ну типа надо прописать это:
[сode]SLMGR.VBS -ilc текущая директория\ASUS.XRM-MS[/сode]
шестое:
ну это и я осилю
Заранее спасибо
P.S.
предполагю, что потребуется создание перменной set current directory
Автор: Utasc
Дата сообщения: 04.03.2007 19:32
Помогите!!!
Мне нужно все "\" поменять на "\\\\"(в документе)
Автор: Elroir
Дата сообщения: 04.03.2007 19:47
Utasc

Код:
@echo off
:: Create the assembler program, by Herbert Kleebauer
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=> %temp%.\sbs2.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU!WvX0GwUY Wv;ovBX2Gv0ExGIuht6>> %temp%.\sbs2.com
echo ?@}IKuNWpe~Fpe?FNHlF?wGMECIQqo{Ox{T?kPv@jeoSeIlRFD@{AyEKj@>> %temp%.\sbs2.com
echo iqe~1NeAyR?mHAG~BGRgB{~H?o~TsdgCYqe?HR~upkpBG?~slJBCyA?@xA>> %temp%.\sbs2.com
echo LZp{xq`Cs?H[C_vHDyB?Hos@QslFA@wQ~~x}viH}`LYNBGyA?@xAB?sUq`>> %temp%.\sbs2.com
echo LRy@PwtCYQEuFK@A~BxPtDss@fFqjVmzD@qBEOEenU?`eHHeBCMs?FExep>> %temp%.\sbs2.com
echo LHsPBGyA?@xAunjzA}EKNs@CA?wQpQpKLBHv?s`WJ`LRCYyIWMJaejCksl>> %temp%.\sbs2.com
echo H[GyFGhHBwHZjjHeoFasuFUJeHeB?OsQH[xeHCPvqFj@oq@eNc?~}Nu??O>> %temp%.\sbs2.com
echo ~oEwoAjBKs?Zp`LBzHQzyEFrAWAG{EFrAqAGYwHTECIQ{coKIsaCsf{Oe~>> %temp%.\sbs2.com
echo CK}Ayre~CNFA{rAyEKFACrA{EKGAjbA}eKGSjNMtQFtc{OAyDGFj?{FDGQ>> %temp%.\sbs2.com
echo KAjNVk_OCAx@e?f{o?CosI}1EGizhljJ~H1ZeG}JBA~rACBMDGjjDG@g0>> %temp%.\sbs2.com
:: Use the program
%temp%.\sbs2.com 0 "\" "\\\\" < "%~1" > "%~2"
:: Delete the program
del %temp%.\sbs2.com

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Сбой активации XP sp2


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