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

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

Автор: wolf0425
Дата сообщения: 13.06.2010 17:28
WesternLight

Цитата:
wolf0425, вот и обращаюсь снова. Хотел проверить как reg.exe от XP работает в W7, прописал путь к reg.exe, лежащему в одной с батником директории

так я и не понял что у тебя за прооблемы, разве что напомню что полный путь к reg.exe надо было впиписывать как "%~dp0reg.exe"


Цитата:
про usebackq в for /f не забыл, хотя надо ли?
ну не мешают, если правильно прописать. Но реально usebackq нужны редко -только когда одиночные кавычки надо в команду цикла вписывать.


Цитата:
После запуска: первое окно c кракозябрами за которыми прячется сообщение "Системе не удается найти указанный путь",
тебя тоже надо учить включать эхо чтоб смотреть на какую же точно команду смд ругается и как он переменные подставил?


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

Автор: Mark_Titov
Дата сообщения: 13.06.2010 17:30

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

Мне не нужно еще куча батников, уже и так хватает в моей системе.
Просто нужно модифицировать эту команду -

Код: start "" cmd /c "sc query & pause"
Автор: wolf0425
Дата сообщения: 13.06.2010 17:35

Цитата:
путь нужно указывать, т.к. в будущем батник будет скомпилирован в exe с помощью qbfc, соответственно обращаться к reg.exe будет через переменную %MyFiles%
да, при таком подходе указывать путь через %~dp0 наверно не стоит, да и с "%~f0" - проблема...

а с кодом непонятно - это он скомпиленый жалуется на "Системе не удается найти указанный путь" или обычный?
Автор: WesternLight
Дата сообщения: 13.06.2010 17:37

Цитата:
так я и не понял что у тебя за прооблемы, разве что напомню что полный путь к reg.exe надо было впиписывать как "%~dp0reg.exe"

проверил - то же самое...

Цитата:
тебя тоже надо учить включать эхо чтоб смотреть на какую же точно команду смд ругается и как он переменные подставил?

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

код выше и ниже:

Код: @echo off

chcp 1251>nul

"%~dp0reg.exe" query "HKCU\Console" /s | findstr.exe /i /r FaceName.*Terminal 1>nul && (
for /f "delims=" %%a in ('"%~dp0reg.exe" query "HKCU\Console" ^|findstr.exe /b /i /r HKEY_CURRENT_USER\\Console\\. ') do "%~dp0reg.exe" delete %%a /f

"%~dp0reg.exe" add "HKCU\Console" /v FontSize /t REG_DWORD /d 1048576 /f
"%~dp0reg.exe" add "HKCU\Console" /v FontFamily /t REG_DWORD /d 54 /f
"%~dp0reg.exe" add "HKCU\Console" /v FontWeight /t REG_DWORD /d 400 /f
"%~dp0reg.exe" add "HKCU\Console" /v FaceName /t REG_SZ /d "Lucida Console" /f

start "" "%~f0" %* & exit
) 1>nul


:begin
echo Кракозябрам нет!

pause
exit
Автор: wolf0425
Дата сообщения: 13.06.2010 17:38
Mark_Titov

Цитата:
Просто нужно модифицировать эту команду -

Код:
start "" cmd /c "sc query & pause"

Что бы с основного окна вызывалось еще окно с сервисами и это окно имело вот такой вид -
ну собственно эту модификацию этой команды ты приводил в коде на преыдущей странице - и эта "модификация" там половину батника занимает


Добавлено:

Цитата:
включал, ничего нового не увидел
а там надо не новое смотреть, а полный тескт сроки кода, после которой печатается ругань.
у меня, кстати, батник никак не ругается, да и у тебя вроде раньше не ругался. Что поменялость то?

опа, с терминалом - заругалось. красота какая - еле прибил ))))
Автор: WesternLight
Дата сообщения: 13.06.2010 17:46

Цитата:
у меня, кстати, батник никак не ругается, да и у тебя вроде раньше не ругался. Что поменялость то?

добавился путь к reg.exe, без него используется windows'ский, а мне нужно, чтобы тот, который лежит в одной директории с батником, он тоже windows'ский, но от XP (у меня W7), без указания пути все ОК!
вот с echo:
Автор: wolf0425
Дата сообщения: 13.06.2010 17:56

Цитата:
добавился путь к reg.exe, без него используется windows'ский
так %cd% - это и есть виндоусовский текущий, смысла добавлять %cd% в батнике - нет.
какая директория является является текущей при запуске скомпиленного - где экзешник лежит или где де распакованный код батника?
или проще самому посмотреть?
Автор: WesternLight
Дата сообщения: 13.06.2010 18:01

Цитата:
так %cd% - это и есть виндоусовский текущий, смысла добавлять %cd% в батнике - нет.

в смысле reg.exe от семерки, ведь сначала поиск ведется по %PATH%, а мне нужно обращение к моему reg.exe, который будет упакован в exe с помощью qbfc, т.к. пока упаковать нет возможности пробую из некомпилированного указать явно путь к reg.exe, вытянутому из XP

Цитата:
какая директория является является текущей при запуске скомпиленного - где экзешник лежит или где де распакованный код батника?

где exe, но я еще не компилировал, пока запускаю только батник, а указывая путь, хочу убедиться, что все ОК что будет обращаться к моему reg.exe
Автор: Mark_Titov
Дата сообщения: 13.06.2010 18:04

Цитата:
ну собственно эту модификацию этой команды ты приводил в коде на преыдущей странице

...Так в том и проблема что скрутить твою команду и тот код для отдельного окна я не могу, требуется ваша квалифицированная помощь...

Код: - и эта "модификация" там половину батника занимает
Автор: wolf0425
Дата сообщения: 13.06.2010 18:09

Цитата:
в смысле reg.exe от семерки, ведь сначала поиск ведется по %PATH%, а мне нужно обращение к моему reg.exe, который будет упакован в exe с помощью qbfc,
а чем плох reg.exe от семерки?
ну и локальный %PATH% можно поправить...
должны чего-то посоветовать с тем как правильно писать запуск программы с пробелом в имени в for /f - мы тупим неподецки, чего-то тривиальное должно быть.
пока в голову приходит только хак:

Код: for /f "delims=" %%a in ('@"%cd%\reg.exe" query "HKCU\Console" ^| findstr.exe /b /i /r HKEY_CURRENT_USER\\Console\\. ') do "%CD%\reg.exe" delete %%a /f
Автор: Mark_Titov
Дата сообщения: 13.06.2010 18:15

Цитата:
чем позже лучше чем 5 минут назад?

Ни чем...
Автор: wolf0425
Дата сообщения: 13.06.2010 18:24
Mark_Titov
Цитата:
...Так я пробовал же уже
не видел пока.
и можно тебя попросить такие широкие бессодержательные картинки или больше не постить, или под тег more прятать?
Автор: Mark_Titov
Дата сообщения: 13.06.2010 18:27
wolf0425

Цитата:
и можно тебя попросить такие широкие бессодержательные картинки или больше не постить, или под тег more прятать?

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

Цитата:
не видел пока.


Код: :service
start "" cmd /c
set "sernum=1000"
for /f "tokens=1*" %%a in ('sc %server% query state^= all') do (
if /i .%%a equ .SERVICE_NAME: set "_servicen_=%%b" && title Scaning: %%b
if /i .%%a equ .DISPLAY_NAME: (
echo %%b
set /a sernum += 1
set "_service_!sernum:~1!=!_servicen_!"
set "_serviced_!sernum:~1!=%%b"
)
)
pause
Автор: wolf0425
Дата сообщения: 13.06.2010 18:36
Mark_Titov, и что по твоему этот код должен делать?
пиши комментарии к каждой строчке - как ты представляешь назначение строки и результат выполнения.
особенно интересует вторая строка, start "" cmd /c


Добавлено:

Цитата:
Это я для наглядности, уберу позже...
чем позже лучше чем 5 минут назад?
Автор: Mark_Titov
Дата сообщения: 13.06.2010 18:45
wolf0425, прикалываешься, а мне не смешно, если бы я знал все значения этих строк я бы не просил помощи, просто сам бы скрутил бы эти команды и все...
Код не мой - потому не знаю что КАЖДАЯ из строк означает...
Вижу что сканирует (sc query) все (all) сервисы на удаленной машине (%server%) и выводит их статус (state).

Цитата:
for /f "tokens=1*" %%a in ('sc %server% query state^= all') do (

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

Спасибо...
Автор: wolf0425
Дата сообщения: 13.06.2010 18:52

Цитата:
Код не мой - потому не знаю что КАЖДАЯ из строк означает...

вторая строка - там точно ТВОЙ код, а не мой.

если действие операторов в какой-то строке непонятно - идешь читать hh ntcmds.chm, если после прочтения будут вопросы применительно к коду - задаешь.
Разобрать и объяснить действие 10 уже готовых строк кода - не проблема ни разу.

а по поводу

Цитата:
так тебе сказали - выделяешь код в отдельный батник и запускаешь батник стартом в новом окне.
Или выделяешь код в кучку внутри текущего батника и вписываешь в начало батника ветвление по параметру, а стартом - с этим параметром себя же и запускаешь
ты не сделал НИЧЕГО. даже не попытался.
Автор: res2001
Дата сообщения: 13.06.2010 18:53
Mark_Titov

Код: @echo off
setlocal enabledelayedexpansion
if "%1"=="/service" GOTO :service
:20
TITLE SERVICES MANAGER
CLS
echo.
ECHO *************************************************** МЕНЮ ***************************************************
ECHO ************************************************************************************************************
ECHO.
ECHO.
ECHO 1. Servise
ECHO.
ECHO 0. Выход из меню
ECHO.
ECHO.
ECHO.
set /p reply= Введите номер и нажмите Enter:
IF /I "%reply%"=="1" (
    start "" call "%0" /service
) else if %reply%==0 goto :eof
GOTO :20

:service
set "server=\\127.0.0.1"
set "sernum=1000"
set "svcn=0"
set "svcd=0"
set /a "sernum=0"
for /f "tokens=1,2,3,* delims=: " %%a in ('sc %server% query state^= all ^| findstr "SERVICE_NAME: DISPLAY_NAME: STATE"') do (
if %%a==SERVICE_NAME (
    set "svcn=%%b"
    title Scaning: %%b
) else if %%a==DISPLAY_NAME (
    set "svcd=%%b %%c %%d"
) else (
    set /a "sernum += 1"
    echo !sernum! ^(!svcn!^) !svcd! %%c
))
pause
Автор: Mark_Titov
Дата сообщения: 13.06.2010 18:53

Цитата:
не проблема ни разу.

Это для тебя не проблема...

Благодарю за помощь...

Добавлено:
res2001, спасибо тебе большое что откликнулся, но код не работает -
пишет -

Цитата:
'""C:\Documents' is not recognized as an internal or external command,
operable program or batch file.


Может я что не так делаю...?
Автор: res2001
Дата сообщения: 13.06.2010 19:15
Mark_Titov
замени
start "" call "%0" /service
на
start "" cmd /C "%0" /service


Добавлено:
Mark_Titov
Тестировал в каталоге с коротким именем и без пробела, поэтому ошибки у меня не было.
Второй вариант должен работать в любых условиях.
Автор: Mark_Titov
Дата сообщения: 13.06.2010 19:20

Цитата:
замени
start "" call "%0" /service
на
start "" cmd /C "%0" /service

...Да, отлично, благодарю тебя res2001, а как можно статусы выровнять по правой стороне?
Автор: res2001
Дата сообщения: 13.06.2010 19:23
Нарыл на RSDN неплохой мануал по батникам:
http://www.rsdn.ru/article/winshell/batanyca.xml
Автор: wolf0425
Дата сообщения: 13.06.2010 19:25

Цитата:
start "" cmd /C "%0" /service

лучше все же на start "" cmd /C "%~f0" /service


Цитата:
Второй вариант должен работать в любых условиях.

оптимизм очень нездоровый, минимум одно исключение знаю я



Добавлено:

Цитата:
Нарыл на RSDN неплохой мануал по батникам:

Mark_Titov, это тебе, бегом читать
Автор: res2001
Дата сообщения: 13.06.2010 19:26
Mark_Titov

Цитата:
а как можно статусы выровнять по правой стороне?

Способа выравнивания в выводе echo не знаю.
Тут дело осложняется тем, что DISPLAY_NAME имеет переменную длину и иногда достаточно длинную.
Может кто-нить другой тут знает?
Автор: wolf0425
Дата сообщения: 13.06.2010 19:32

Цитата:
Может кто-нить другой тут знает?
ну я наверно знаю, но я один раз для Mark_Titov код печати статусов сервисов с выравниванием по номеру колонки - уже писал когда-то, на пользу ему это не пошло.
Разбираться в том что же делает код что для него пишут - он кажись принципиально не планирует.

Автор: res2001
Дата сообщения: 13.06.2010 20:19
wolf0425
намекни, пригодится
Автор: wolf0425
Дата сообщения: 13.06.2010 20:23
res2001 загнать в переменную, дополнить её справа избытком пробелов, отрезать первые nn символов, вывести. примерно так оно и делалось:

цвет - это уже его собственная самодеятельность
Автор: res2001
Дата сообщения: 13.06.2010 20:24
wolf0425
ясно, спс.

Добавлено:
Mark_Titov
Применил способ выравнивания от wolf0425, за что ему отдельный респект
Замени
echo !sernum! ^(!svcn!^) !svcd! %%c

на это
set "txt=!sernum! ^(!svcn!^) !svcd! "
echo !txt:~0,70! %%c

Обрати внимание на set там в конце куча пробелов, около 70 должно быть.
Автор: Mark_Titov
Дата сообщения: 13.06.2010 21:33

Цитата:
Замени
echo !sernum! ^(!svcn!^) !svcd! %%c
на это
set "txt=!sernum! ^(!svcn!^) !svcd! "
echo !txt:~0,70! %%c

Отлично! Парни, спасибо за ваш труд и за помощь!
Благодарю....
Автор: WesternLight
Дата сообщения: 13.06.2010 21:47

Цитата:
пока в голову приходит только хак:

Код:
for /f "delims=" %%a in ('@"%cd%\reg.exe" query "HKCU\Console" ^| findstr.exe /b /i /r HKEY_CURRENT_USER\\Console\\. ') do "%CD%\reg.exe" delete %%a /f

wolf0425, ну, так вроде бы работает... только в чем суть? Что значит '@? И что получается, что одинарные и двойные кавычки в for /f использовать нельзя? Итого код:

Код: @echo off

chcp 1251>nul

"%CD%\reg.exe" query HKCU\Console /s | findstr.exe /i /r FaceName.*Terminal 1>nul && (

for /f "delims=" %%a in ('@"%CD%\reg.exe" query "HKCU\Console" ^| findstr.exe /b /i /r HKEY_CURRENT_USER\\Console\\. ') do "%CD%\reg.exe" delete %%a /f

"%CD%\reg.exe" add "HKCU\Console" /v FontSize /t REG_DWORD /d 1048576 /f
"%CD%\reg.exe" add "HKCU\Console" /v FontFamily /t REG_DWORD /d 54 /f
"%CD%\reg.exe" add "HKCU\Console" /v FontWeight /t REG_DWORD /d 400 /f
"%CD%\reg.exe" add "HKCU\Console" /v FaceName /t REG_SZ /d "Lucida Console" /f

start "" "%~f0" %* & exit

) 1>nul


:begin
echo Кракозябрам нет!

pause
exit
Автор: wolf0425
Дата сообщения: 13.06.2010 22:57

Цитата:
только в чем суть? Что значит '@?
@ в первом символе команды - дополнительно напоминает что команду запускать без эховывода.
А работает с ним потому, что у for какие-то глюки с двойными кавычками, если с них начинается имя команды внутри (' '). если первая команда начинается с буквы/цифры/@ - она опознается замечательно.
а одинарные нельзя без usebackq - они только снаружи


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

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

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


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