Ru-Board.club
← Вернуться в раздел «Программы»

» Командная строка, батники, сценарии (bat, cmd) 2

Автор: 01MDM
Дата сообщения: 05.04.2008 07:46
Rush
Хороший справочник, спасибо
Автор: igor_andreev
Дата сообщения: 05.04.2008 11:38
Rush
Спасибо. А я с этой документации(только на английском) и начинал знакомиться с регэкспами, мне в vbscript понадобилось однажды
Автор: XXXXL
Дата сообщения: 05.04.2008 13:02
Здравствуйте парни!
Прошу вас в очередной раз помочь.
Нужно устроить сравнение двух .txt документов, если содержимое одинаковое то запустить определенное приложение.
Спасибо.
Автор: igor_andreev
Дата сообщения: 05.04.2008 13:13
XXXXL

Код:
fc /l 1.txt 2.txt
if not errorlevel 1 start program.exe
Автор: XXXXL
Дата сообщения: 05.04.2008 14:27
igor_andreev, спасибо!!!
Автор: 01MDM
Дата сообщения: 05.04.2008 15:50
KfarYm
Все очень просто:
пробелы при копировании с форума могут вызвать неправильное выполнение сценария в целом.

Смотри в каждом конкретном случае вывод команд и значения переменных. Всех ньюансов не предусмотришь.

Такой пример - отформатировать вывод команды "fsutil fsinfo drives"
И таких с нуль-пробелом есть.

Я с этим намучался в свое время
Автор: KfarYm
Дата сообщения: 05.04.2008 18:00
01MDM

Цитата:
Все очень просто:

Увы, совсем не просто…
Даже в конце строк пробелы мешают НЕ ВСЕГДА.
В начале строк, похоже, пробелы\табуляции игнорируются интерпретатором, хотя и тут есть исключение\я
Хочу найти какую-нибудь систематизированную инфу по теме, должны ж быть общие правила (пусть и с исключениями).
Пример, показывающий потребность такой инфы:
используем в качестве разделителей пробел==`space` и двоеточие,
так вот из трех вариантов
"delims=:`space`"
"delims=:"
"delims=`space`:"
правильный только первый. почему? какие правила тут работают?
Автор: Elroir
Дата сообщения: 05.04.2008 23:02
KfarYm
В большинстве случаев, проблемы с пробелами возникают при использовани команды set.
В этих случаях, пробел в конце записывается в переменную и может помешать выполнению кода. Пример:

Код:
set a=abc
set b=%a%def
Автор: 01MDM
Дата сообщения: 06.04.2008 00:09
KfarYm

Цитата:
Увы, совсем не просто…

Я сразу и сказал:

Цитата:
Смотри в каждом конкретном случае

Другое дело когда вывод "неадекватен"

Автор: KfarYm
Дата сообщения: 06.04.2008 00:20
01MDM
Elroir
Спасибо за участие.
Выводы не утешают: каждый должен получить свою пайку шишек…
Может поднять тему и собрать по крохам накопленный опыт?
Жалко времени на преодоление "такой чепухи", как синтаксис, правильнее - чистописание.
Автор: Fraerok
Дата сообщения: 06.04.2008 12:59
Нужно из батника запустить "Foxit Reader.exe" с ключем "-Register"... че-то все не могу сообразить как это сделать)
Автор: Elroir
Дата сообщения: 06.04.2008 13:39
Fraerok

Код: start "" "Foxit Reader.exe" -Register
Автор: Fraerok
Дата сообщения: 06.04.2008 15:14
Elroir
Спасибо огромное!

Еще такой вопрос - есть файл uninstall.log и в нем среди прочих есть строки:

Цитата:
File: C:\Documents and Settings\All Users.WINDOWS\Главное меню\Программы\Mozilla Sunbird\Mozilla Sunbird.lnk
File: C:\Documents and Settings\All Users.WINDOWS\Главное меню\Программы\Mozilla Sunbird\Mozilla Sunbird (Безопасный режим).lnk
File: C:\Documents and Settings\scar\Application Data\Microsoft\Internet Explorer\Quick Launch\Mozilla Sunbird.lnk
File: C:\Documents and Settings\All Users.WINDOWS\Рабочий стол\Mozilla Sunbird.lnk

как бы мне изменить их на:

Цитата:
File: C:\Documents and Settings\All Users.WINDOWS\Главное меню\Программы\Sunbird.lnk
File: C:\Documents and Settings\All Users.WINDOWS\Рабочий стол\Программы\Sunbird.lnk

Т.е. 2 строки удалить (про безопасный режим и Quicklaunch), а в двух оставшихся изменить немного содержание
Автор: JekaRus
Дата сообщения: 07.04.2008 02:46
01MDM
Продолжаю совершенствовать батник удаления файлов. Последние строчки удаления файлов такие

elete
attrib -r -s -h *.* 1>nul 2>&1
del /q /a /f *.* 1>nul 2>&1
for /f "tokens=*" %%i in ('dir /b /ad') do rd /s /q "%%i" 1>nul 2>&1

Проблема в том, что некоторые файлы система удалить не дает а переименовать пожалуйста. Какие строчки дописать чтобы после удаления неудаленные файлы и папки переименовывались. Но так чтобы от предыдущих применений имена не мешали. То есть время дописывать к имени файла или еще что нибудь.
Автор: Kilich
Дата сообщения: 07.04.2008 08:36
Ребята!
А никто часом не знает, как в батнике написать нечто - чтобы можно было указать время отключение дисплея или не отключать никогда(как это можно сделать в свойствах заставки-питание)
Очень нужно...
Автор: 01MDM
Дата сообщения: 07.04.2008 08:48
JekaRus

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


Ты удаляешь на работающей системе? Если нет, то надо выставить атрибуты на файлы не только в корне папки, с которой начинается "зачистка", но и рекурсивно вниз.

Я специально создал тестовую папку с подпками и файлами. Выставил самые "неудаляемые" аттрибуты. В результате все удалилось и с выделенной строкой и вообще без нее
Попробуй так:

Код:
:delete
pushd "c:\path\to\folder"
for /f "tokens=*" %%i in ('dir /b /s') do attrib -r -s -h "%%i" 1>nul 2>&1
del /q /a /f *.* 1>nul 2>&1
for /f "tokens=*" %%i in ('dir /b /ad') do rd /s /q "%%i" 1>nul 2>&1
popd
Автор: JekaRus
Дата сообщения: 07.04.2008 09:32
01MDM
На самом деле система работающая. Я этот батник по сети запускаю и у юзеров место на дисках освобождаю. Но когда возникает надобность драйвер для принтера установить, а он ни в какую не устанавливается нужно вычистить папку spool. В ней файлы от драйверов хранятся и удалить их нельзя тк они заняты системой. А переименовать их очень даже можно. Проверено неоднократно. До сих пор все это в ручную делаю. Нужно просто в конце удаления файлов и папок цикл написать по переименованию. Батник сам себя не удалит. Я тебе только концовку написал. Полный вид такой

@echo off
setlocal
for %%i in (C) do (if not %~d0==%%i: call:clean %%i)
goto:eof
:clean
if exist C:\WINDOWS\system32\spool\drivers\w32x86 (
pushd C:\WINDOWS\system32\spool\drivers\w32x86
call:delete
popd
)
goto:eof
elete
attrib -r -s -h *.* 1>nul 2>&1
del /q /a /f *.* 1>nul 2>&1
for /f "tokens=*" %%i in ('dir /b /ad') do rd /s /q "%%i" 1>nul 2>&1
rename *.*


И еще у этого батника есть странная особенность. Почему то он не работает если запустить с диска С: А с диска Д: нормально все отрабатывает. Это не принципиально просто копирую на шару d$ а не c$ и оттуда запускаю. Просто интересно почему.


Автор: igor_andreev
Дата сообщения: 07.04.2008 09:44

Цитата:
Просто интересно почему.

из-за этого

Цитата:
for %%i in (C) do (if not %~d0==%%i: call:clean %%i)

Ведь когда батник находится на диске С будет if not C: == C:
Автор: 01MDM
Дата сообщения: 07.04.2008 10:40
JekaRus

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

Так я не понял, он очищает spool или нет? Или надо переименовывать?
Автор: magazinus
Дата сообщения: 07.04.2008 12:29
Знатоки, подскажите решение задачки: есть два текстовых файла (ifname1.txt, ifname2.txt), в которых каждая запись начинается с новой строки, файлы различаются двумя-тремя записями, необходимо сравнить их и полностью удалить отличающиеся строки. Можно использоваться стороннюю консольную утилиту. (вопрос только - какую? )
Автор: igor_andreev
Дата сообщения: 07.04.2008 12:48
magazinus
Так навскидку findstr /g:1.txt /l /v 2.txt выведет на экран строки из файла 2.txt, которых нет в файле 1.txt. Строки должны быть короче кажется 130 символов, а то findsr молча не будет сравнивать.
Автор: magazinus
Дата сообщения: 07.04.2008 13:15
igor_andreev
Строки длиннее 130 симв. 200-300 симв.
Автор: Fraerok
Дата сообщения: 07.04.2008 13:18
igor_andreev
а, если после поиска их нужно заменить?


Цитата:
есть файл uninstall.log и в нем среди прочих есть строки:

Цитата:File: C:\Documents and Settings\All Users.WINDOWS\Главное меню\Программы\Mozilla Sunbird\Mozilla Sunbird.lnk
File: C:\Documents and Settings\All Users.WINDOWS\Главное меню\Программы\Mozilla Sunbird\Mozilla Sunbird (Безопасный режим).lnk
File: C:\Documents and Settings\scar\Application Data\Microsoft\Internet Explorer\Quick Launch\Mozilla Sunbird.lnk
File: C:\Documents and Settings\All Users.WINDOWS\Рабочий стол\Mozilla Sunbird.lnk

как бы мне изменить их на:

Цитата:File: C:\Documents and Settings\All Users.WINDOWS\Главное меню\Программы\Sunbird.lnk
File: C:\Documents and Settings\All Users.WINDOWS\Рабочий стол\Программы\Sunbird.lnk

Т.е. 2 строки удалить (про безопасный режим и Quicklaunch), а в двух оставшихся изменить немного содержание

Автор: igor_andreev
Дата сообщения: 07.04.2008 14:10
Fraerok

Код:
@echo off
chcp 1251

for /f "tokens=*" %%a in (uninstall.log) do call :change_path "%%a"
type uninstall.bak | find /v "\Quick Launch\" | find /v "(Безопасный режим).lnk">uninstall.log
goto :eof

:change_path
set "line=%~1"
set "line=%line:\Рабочий стол\Mozilla Sunbird.lnk=\Рабочий стол\Программы\Sunbird.lnk%"
set "line=%line:\Программы\Mozilla Sunbird\Mozilla Sunbird.lnk=\Программы\Sunbird.lnk%"
echo %line%>>uninstall.bak
set "line="
Автор: Rush
Дата сообщения: 07.04.2008 14:39
magazinus
Если тебя не устроит предыдущее решение (может медленно или еще чего), я тут набросал на vbscript:

Код: if wscript.arguments.count = 2 then
fname = wscript.arguments.item(0)
fname2 = wscript.arguments.item(1)
dim newcounts, txtarr3()
set fso = createobject("scripting.filesystemobject")
set one = fso.opentextfile(fname, 1):txt = one.readall:one.close
set two = fso.opentextfile(fname2, 1):txt2 = two.readall:two.close
if txt <> txt2 then
txtarr = split(txt, vbcrlf):txtarr2 = split(txt2, vbcrlf)
count = ubound(txtarr):count2 = ubound(txtarr2)
if count > count2 then counts = count2 else counts = count
redim txtarr3(counts)
for i=0 to counts
if txtarr(i) = txtarr2(i) then
txtarr3(newcounts) = txtarr(i)
newcounts = newcounts + 1
end if
next
redim preserve txtarr3(newcounts-1)
txt = join(txtarr3, vbcrlf)
set one = fso.opentextfile(fname, 2):one.write txt:one.close
set two = fso.opentextfile(fname2, 2):two.write txt:two.close
end if
end if
wscript.quit
Автор: igor_andreev
Дата сообщения: 07.04.2008 15:08

Цитата:
Если тебя не устроит предыдущее решение (может медленно или еще чего),

или еще чего Эт я как пример привел, для простейших строк сработает. Батник он и есть батник, будет спотыкаться на строчках со спецсимволами <>" ...
Автор: magazinus
Дата сообщения: 07.04.2008 15:39
igor_andreev
Спасибо, работает отлично, но правда при кол-ве строк > 300 - довольно медленно.

Rush
По-моему не совсем верно работает. Ищет первое различие и пишет на выход все совпадения до первого различия, остальное вырезает вообще. Вот, [more=например.]
Файл 1.txt:

Цитата:
12345
123456
1234567
12345678
123456789
1234567890
THE FAKE STRING NUMBER 1
12345678911
12345678912
12345678913
12345
123456
THE FAKE STRING NUMBER 2
1234567
12345678
123456789
1234567890
THE FAKE STRING NUMBER 3
12345678911
12345678912
12345678913
12345
123456
THE FAKE STRING NUMBER 4
1234567
12345678
123456789
1234567890
12345678911
THE FAKE STRING NUMBER 5
12345678912
12345678913
12345
123456
1234567
12345678
THE FAKE STRING NUMBER 6
123456789
1234567890
12345678911
12345678912
12345678913

Файл 2.txt:

Цитата:
12345
123456
1234567
12345678
123456789
1234567890
12345678911
12345678912
12345678913
12345
123456
1234567
12345678
123456789
1234567890
12345678911
12345678912
12345678913
12345
123456
1234567
12345678
123456789
1234567890
12345678911
THE FAKE STRING NUMBER 5
12345678912
12345678913
12345
123456
1234567
12345678
THE FAKE STRING NUMBER 6
123456789
1234567890
12345678911
12345678912
12345678913

На выходе в 1.txt и 2.txt имеем:

Цитата:
12345
123456
1234567
12345678
123456789
1234567890

[/more].
Автор: Rush
Дата сообщения: 07.04.2008 16:10
magazinus

Цитата:
По-моему не совсем верно работает. Ищет первое различие и пишет на выход все совпадения до первого различия, остальное вырезает вообще

Так ведь я просто сделал сравнение строк один в один, а не рекурсивно. Они ведь у тебя не совпадают дальше 6 строки. Я так и думал, что тебе на полное соответствие надо.
Тебе расположение неважно, лишь бы одинаковые по содержанию были?
Автор: magazinus
Дата сообщения: 07.04.2008 16:11
Rush

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

Ага. Без различающихся строк...
Автор: crackcrack
Дата сообщения: 07.04.2008 16:16
Как у bat поменять ярлычок (иконку)?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: DVD-video (ДВД-видео) - что и как (часть 3)


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