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

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

Автор: dvcher
Дата сообщения: 11.11.2009 13:54
mugil_cephalus
if "%1" equ "n" чего делать


а можно по подробней чет не выходит


создать командный файл выполняющий в зависимости от ключа один из 3-х вариантов работы:
- с ключом /n дописывает в начало указанных текстовых файлов строку с именем текущего файла;
- с ключом /b создает резервные копии указанных файлов;
- с ключом /d удаляет указанные файлы после предупреждения.
Автор: Uruloke
Дата сообщения: 11.11.2009 13:59
king_stiven
Эм, не заметил.
Но мне бы для каталогов это заточить.
Автор: mugil_cephalus
Дата сообщения: 11.11.2009 14:32
01MDM
в файл d надо записать содержимое файла s (файл s - строка1:_text_ и строка2:пусто) без пустой строки, то есть файл d должен иметь всего одну строку - с текстом и не иметь пустой
set /p=<s - наверное синтаксисч неверен, это я подразумевал ввод из файла s

king_stiven
исходная задача ( http://forum.ru-board.com/topic.cgi?forum=62&topic=17154&start=1360#19 ):

Цитата:
Здравствуйте. Помогите пожалуйста сделать такие батники:
1) есть 100 текстовых файлов, пронумерованных от 1.txt до 100.txt. В каждом файле 1 слово и пустая строка, так вот как можно удалить эту пустую строку.



Цитата:
1) файлы в которых надо удалить пустую строку находятся в С:\test


--------------------------------
01MDM
king_stiven

вот так я "выдирал" пустую строку
Цитата:


Код:
echo on
for /f "tokens=*" %%i in ('type w:\1.txt') do echo %%i
date /t



листинг:
F:\Documents and Settings\admin>cd /d w:

W:\>batch.bat

W:\>echo on

W:\>for /F "tokens=*" %i in ('type w:\1.txt') do echo %i

W:\>echo _text_
_text_

W:\>date /t
Wed 11/11/2009

W:\>


, но при вставке _text_ в *.txt добавлялась пустая строка

Добавлено:
king_stiven

Цитата:
for /f "usebackq tokens=*" %%i in ("str.txt") do 0>nul 1>str.txt set /p="%%i"

а так можно, консоль не затребует set без /p, ведь set /p - для ввода с клавы?

Добавлено:



01MDM
king_stiven

вообще для soft111 я составил код, который, как я понимаю, выдирает пустую строку из source-txt , но вставляет ее снова
echo on
for %%A in (C:\test\*.txt) do call:_1 %%A
goto :eof

:_1
for /f "tokens=*" %%i in ('type %1') do (echo %%i>C:\test\%~n1_.txt && del /q %1 && ren C:\test\%~n1_.txt %~nx1)
goto :eof

просто с такой экзотикой (для меня) как удаления CR,LF не сталкивался...

Добавлено:
dvcher
Уильям Станек - Командная строка Microsoft Windows ( http://rapidshare.com/files/89629093/Stanek_CLI_MS_Win.rar ) - посм. страницу 50-54 и 63-67 и 181 книги (а не *.pdf-файла)

Добавлено:
01MDM
king_stiven

проверил в command-line mode такой код от king_stiven W:\>for /F "tokens=*" %i in ('type 1.txt') do 0>nul 1>str.txt set /p="%i" - работает

Добавлено:
soft111
попробуй (сначала в черновую, шоб не попортить):


Код: echo on
for %%A in (C:\test\*.txt) do call:_1 %%A
goto :eof

:_1
for /f "tokens=*" %%i in ('type %1') do 0>nul 1>C:\test\%~n1_.txt set /p="%%i" && del /q %1 && ren C:\test\%~n1_.txt %~nx1
goto :eof
Автор: 01MDM
Дата сообщения: 11.11.2009 16:16
mugil_cephalus

Цитата:
в файл d надо записать содержимое файла s (файл s - строка1:_text_ и строка2:пусто) без пустой строки


Код:
@echo off
setlocal

0<c set /p "string="
0>nul 1>d set /p="%string%"
Автор: mugil_cephalus
Дата сообщения: 11.11.2009 16:18
dvcher
вот можешь еще посмотреть http://forum.ru-board.com/topic.cgi?forum=5&topic=25393&start=294&limit=1&m=1#1

Добавлено:
01MDM

Цитата:
Код:
@echo off
setlocal

0<c set /p "string="
0>nul 1>d set /p="%string%"

спасибо, у soft111 файлов много (думаю 100.000), думаю использовать такой код
Цитата:
Код:echo on
for %%A in (C:\test\*.txt) do call:_1 %%A
goto :eof

:_1
for /f "tokens=*" %%i in ('type %1') do 0>nul 1>C:\test\%~n1_.txt set /p="%%i" && del /q %1 && ren C:\test\%~n1_.txt %~nx1
goto :eof

у меня, по крайней мере, лексема for /f "tokens=*" %%i in ('type %1') do 0>nul 1>C:\test\%~n1_.txt set /p="%%i" работает (в плане использования set /p), то есть из source-txt в destination-txt попадает только строка с текстом - без пустой строки

Добавлено:
01MDM
кстати, хотел спросить, что означает поток № 0 ? впервые столкнулся. всегда видел в скриптах потоки №№ 1 и 2. предполагаю, что это сдвиг: 0 - standardOutput, 1 - errorsOutput
Автор: 01MDM
Дата сообщения: 11.11.2009 16:58
mugil_cephalus

Цитата:
кстати, хотел спросить, что означает поток № 0 ?


0 - STDIN (ввод)
1 - STDOUT (вывод)
2 - STDERR (ошибки)
3-9 - Предопределяемые

Потоки можно перенаправлять и создавать новый поток на выходе из штатного:

Код:
@echo off
echo qwerty 3>1.TXT 1>&3
Автор: mugil_cephalus
Дата сообщения: 11.11.2009 17:06
01MDM
спасибо

STD - standard...
Автор: king_stiven
Дата сообщения: 11.11.2009 17:14
Uruloke
Скопируй из ссылкы. что я тебе давал пример. вставь сюда. разберём под каталоги.
mugil_cephalus
Ну на этот вопрос я ответил, правда только для одного файла, для множества по моему ты сам сможешь сделать, а вообще то автор молчит, ему это уже не надо, или он воспользовался командой ech
Автор: mugil_cephalus
Дата сообщения: 11.11.2009 17:22
king_stiven

Цитата:
или он воспользовался командой ech

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

хотя кто знает... думаю он уже долго капает этот вопрос и файлов у него >1.000.000
p.s.
хотя battch медленно отрабатывают - ему на wsh бы
Автор: wolf0425
Дата сообщения: 11.11.2009 22:02
mugil_cephalus
ну то есть замечательно видим что никакого лишнего прохода для пустой строки цикл не дает.
молодец, возьми с полки пирожок


Цитата:
в файл d надо записать содержимое файла s (файл s - строка1:_text_ и строка2:пусто) без пустой строки
т.е. надо понимать что файл s из двух строк, в сумме _text_CRLFCRLF

вывод всех непустых строк файла s в файл, построчно:
for /f "delims=" %%a in ('type s') do 1>>file.txt echo.%%a
Вывод всех непустых строк файла в одну незавершенную строку файла
for /f "delims=" %%a in ('type s') do 0<nul 1>>file2.txt set /p=%%a


Добавлено:
как сделать удаление строк из файла, начиная со строки содержащей подстроку string1 и заканчивая (включительно) первой после string1 строкой содержащей string2 ?
наличие в строках символов <> - гарантировано
Автор: BVV63
Дата сообщения: 12.11.2009 07:05
Снова подниму вопрос по получению даты в нужном формате.
В шапке есть ссылка на совет igor_andreev:
http://forum.ru-board.com/topic.cgi?forum=5&topic=25393&start=347&limit=1
но мне кажется, что данный способ хоть и весьма остроумен и изобретателен, но всё ж уж больно неизящен. Больше понравился метод, предложенный Maqentaer на 67-й странице этой темы, с использованием wmic:
for /f "skip=1" %%i in ('wmic os get LocalDateTime') do set datetime=%%i
и т. д., но у меня на Win 2W3 он отказался работать. Я стал выяснять, запустил из консоли (предварительно убрав один знак процента перед переменной), увидел сделующий ответ системы:
set datetime=20091112092002.412000+300
set datetime=
Т. е. переменной присваивается нужное значение, но откуда-то берётся вторая строка, которая уничтожает переменную. Кстати, проверил в Win 7, там конструкция вообще отказалась наотрез работать.
Попытался решить своим методом (кстати, может кому пригодится):

:Сохранить текущий формат даты
for /f "skip=1 tokens=3" %%A in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set CurrentDateFormat=%%A
:Установить свой формат даты
reg add "HKCU\Control Panel\International" /f /v sShortDate /t REG_SZ /d "свой формат"
...
:Получить дату в нужном формате
DATE /T > (или >>)...
:или
for /f %%A in ('DATE /T') do set LocalDate=%%A
...
:Восстановить преждний формат даты
reg add "HKCU\Control Panel\International" /f /v sShortDate /t REG_SZ /d "%CurrentDateFormat%"

Когда используется в контексте пользователя, то всё OK, никаких проблем. Но мне нужно в запланированном задании, которое исполняется (по ряду причин) в контексте локальной системы. И под системой механизм не работает. Я в виде эксперимента запустил под системой (посредством AT) консоль и выяснил, что производимые изменения в реестре на запущенную копию консоли не влияют (именно, когда работа идёт под локальной системой), вот если из неё запустить вторую копию, то там эти изменения проявятся. Но заморачиваться с запуском второго пакетника, передачей туда-обратно параметров через файлы уж очень не хочется (не изящно ).
Подскажите, почему у меня не работает метод Maqentaer получения даты посредством wmic? Или может кто ещё какой способ предложит?
Автор: Uruloke
Дата сообщения: 12.11.2009 08:03
king_stiven
timediff.vbs:

Код: WScript.Quit (DateDiff("d", CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments.Item(0)).DateCreated, Now))
Автор: mugil_cephalus
Дата сообщения: 12.11.2009 08:09
wolf0425

Цитата:
вывод всех непустых строк файла s в файл, построчно:
for /f "delims=" %%a in ('type s') do 1>>file.txt echo.%%a


этот код добавляет пустую строку на этапе echo - можешь сам проверить

я это уже проверял:
Цитата:
я попробовал 2 способа:
D:\>(echo hi)>1

D:\>1>x echo hi

в обоих случаях в каждом файле добавляется лишняя пустая строка


- между прочем, это твои рекомендации с 68-ой страницы
Цитата:
19w85
Цитата:Есть вопрос, почему не происходит вывода в файл:

потому что пробел с цифрой перед >> трактуется как номер потока
есть два способа обхода, на выбор:

set "x=5"
(echo %x%)>>zz.txt
1>>xx.txt echo %x%

в отличие от варианта Elroir они делают что ожидаешь и при set "x=Section 1"


а echoDot - это 3-ий вариант (от Elroir)

Добавлено:
BVV63

Цитата:
Больше понравился метод, предложенный Maqentaer на 67-й странице этой темы, с использованием wmic:

мне метода Maqentaer тоже понравилась
Автор: king_stiven
Дата сообщения: 12.11.2009 08:35
Uruloke
Не пашет? Попробуй в timediff.vbs: заменить GetFile на GetFolder
и ни в коем случае не называй батники именами команд!
Автор: denisbobrov3
Дата сообщения: 12.11.2009 08:46
Добрый день. Возникла проблема. Требуется подсчитать количество строк в файле. Сделал так:
SET /A N=0
FOR /F %%i IN (%1) DO SET /A N=N+1

Проблема в том, что не считает пустые строки.
Автор: BVV63
Дата сообщения: 12.11.2009 09:07
mugil_cephalus

Цитата:
мне метода Maqentaer тоже понравилась

Угу, только он у меня не работает. Проблему я решил, но менее красиво, нежели этим методом. Выяснил, что прога now.exe из пакета "Windows Resource Kits" Win2K3 дату и время тоже всегда одним форматом выдаёт. Воспользовался ею, единственно, там месяц не в числовом виде передаётся, а тремя первыми буквами. Пришлось дополнительно установить 12 проверок.
Автор: king_stiven
Дата сообщения: 12.11.2009 09:11
denisbobrov3
sed -n "$=" 1.txt
утилита sed в шапке
Автор: mugil_cephalus
Дата сообщения: 12.11.2009 09:17
denisbobrov3

Цитата:
Проблема в том, что не считает пустые строки.


Цитата:
F:\Documents and Settings\admin>for /?
Выполнение указанной команды для каждого файла набора.

.............................
Набор содержит имена одного или нескольких файлов, которые по очереди
открываются, читаются и обрабатываются. Обработка состоит в чтении
файла, разбивки его на отдельные строки текста и выделения из каждой
строки заданного числа подстрок (в том числе нуля). Затем найденная
подстрока используется в качестве значения переменной при выполнении
основного тела цикла. По умолчанию ключ /F выделяет из каждой строки файла
первое слово, очищенное от окружающих его пробелов. Пустые строки
в файле пропускаются.
Необязательный параметры "ключи" служит для
переопределения заданных по умолчанию правил обработки строк. Ключи
представляют собой заключенную в кавычки строку, содержащую указанные
параметры. Ключевые слова:

.........................................


for'om не посчитаешь

посмотри может fc сможет посчитать
Автор: denisbobrov3
Дата сообщения: 12.11.2009 09:22
king_stiven
В том то идело, что нельзя использовать сторонние утилиты...
Автор: mugil_cephalus
Дата сообщения: 12.11.2009 09:26
denisbobrov3
fc /N - Вывод номеров строк при сравнении текстовых файлов ASCII.
Автор: king_stiven
Дата сообщения: 12.11.2009 09:28
denisbobrov3
FIND /V /C "" 1.txt
Автор: mugil_cephalus
Дата сообщения: 12.11.2009 09:31
BVV63

Цитата:
но у меня на Win 2W3 он отказался работать. Я стал выяснять, запустил из консоли (предварительно убрав один знак процента перед переменной), увидел сделующий ответ системы:
set datetime=20091112092002.412000+300
set datetime=
Т. е. переменной присваивается нужное значение, но откуда-то берётся вторая строка, которая уничтожает переменную. Кстати, проверил в Win 7, там конструкция вообще отказалась наотрез работать.


Цитата:
Когда используется в контексте пользователя, то всё OK, никаких проблем. Но мне нужно в запланированном задании, которое исполняется (по ряду причин) в контексте локальной системы. И под системой механизм не работает. Я в виде эксперимента запустил под системой (посредством AT) консоль и выяснил, что производимые изменения в реестре на запущенную копию консоли не влияют (именно, когда работа идёт под локальной системой), вот если из неё запустить вторую копию, то там эти изменения проявятся. Но заморачиваться с запуском второго пакетника, передачей туда-обратно параметров через файлы уж очень не хочется (не изящно ).
Подскажите, почему у меня не работает метод Maqentaer получения даты посредством wmic? Или может кто ещё какой способ предложит?


у тебя где-то ошибка, но проверить не могу - у меня win 5.1
попробуй вместо at - schtasks - она гибче
set datetime=20091112092002.412000+300
set datetime= - это output, - попробуй for'om вырезать только 1-ую строку и использовать ее

Добавлено:
denisbobrov3
да еще вариант king_stiven с FIND
еще можно findstr
Автор: denisbobrov3
Дата сообщения: 12.11.2009 09:36

Цитата:
FIND /V /C "" 1.txt

Как то можно присвоить значение данного выражения переменной?
Автор: mugil_cephalus
Дата сообщения: 12.11.2009 09:38
denisbobrov3
set "var=FIND ^/V ^/C "" 1.txt"

или set "var=FIND /V /C "" 1.txt" - у меня и так, без escape-символов, работает
Автор: igor_andreev
Дата сообщения: 12.11.2009 09:40
denisbobrov3
Если последняя строка не пустая, то так можно:

Код:
for /f "tokens=1 delims=:" %%a in ('findstr /n "." test.txt') do set /a "linecount=%%a"
Автор: denisbobrov3
Дата сообщения: 12.11.2009 09:55

Цитата:
или set "var=FIND /V /C "" 1.txt" - у меня и так, без escape-символов, работает

у меня в результате переменной var просто присваивается значение FIND /V /C "" 1.txt
В смысле, не результат выражения FIND /V /C "" 1.txt, а именно набор символов "FIND /V /C "" 1.txt"
Автор: mugil_cephalus
Дата сообщения: 12.11.2009 10:03
denisbobrov3

Цитата:
у меня в результате переменной var просто присваивается значение FIND /V /C "" 1.txt
В смысле, не результат выражения FIND /V /C "" 1.txt, а именно набор символов "FIND /V /C "" 1.txt"

for /f %%i in ('find /v /c "" 1.txt') do set "var=%%i"
Автор: BVV63
Дата сообщения: 12.11.2009 10:08
mugil_cephalus

Цитата:
set datetime= - это output, - попробуй for'om вырезать только 1-ую строку и использовать ее

А как? У меня, честно говоря, очень мало опыта общения с конструкцией for... in... do... Я знаю, что можно пропустить строки сверху, используя skip. Но как отделаться от строк снизу?
Автор: mugil_cephalus
Дата сообщения: 12.11.2009 10:19
BVV63

Цитата:
А как? У меня, честно говоря, очень мало опыта общения с конструкцией for... in... do... Я знаю, что можно пропустить строки сверху, используя skip. Но как отделаться от строк снизу?


есть совет от Maqentaer

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

можно примерно так.

Код:for .... do do call :_1 %%A &goto ext
:ext


http://forum.ru-board.com/topic.cgi?forum=62&topic=17154&start=1380#18
но я не пробовал (у него кажется опечатка - двойной do)
а вообще все зависит от конкретного output'a
можно output if'om проверить: for in output do if

for /f %%A in (output) do call :_1 %%A
goto :eof

:_1
if "%1" equ
if "%1" equ
goto :eof

--------------------
set datetime=20091112092002.412000+300
set datetime= - в такой конструкции с tokens=2 delims== получишь 20091112092002.412000+300

p.s.
повторюсь, все зависит от - смотря чего и откуда доставать
Автор: Maqentaer
Дата сообщения: 12.11.2009 10:34
да, опечатка.
как посоветовал igor_andreev можно сделать так:

Код: set "datetime="
for /f "skip=1" %%i in ('wmic os get LocalDateTime') do if not defined datetime set "datetime=%%i"

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778

Предыдущая тема: во вкладке автозагрузка


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