Модераторы: bartram, Akella

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несколько вопросов по командной строке 
V
    Опции темы
MrDmitry
Дата 26.2.2011, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Всем привет. Появилось несколько вопросов по командной строке
1. Как в cmd написать логическую операцию сравнения? То есть например в нормальных языках программирования можно написать так

Код

if a>=b then  b:=a;


В cmd же если я пишу любые другие символы кроме как == выдается ошибка (( Google не помог.

2. Как я понял в cmd невозможно воспроизводить звук. Но это возможно в vbs. Пришла идея сделать так записать файл vbs

Код

@ECHO Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long > beep.vbs
@ECHO Private Sub Form_Click() >> beep.vbs
@ECHO Dim res >> beep.vbs
@ECHO res = mciExecute("Play C:\Путь_до_файла") >> beep.vbs
@ECHO End Sub >> beep.vbs


Но проблема в том что не могу экранировать AS. И если вызвать файл beep.vbs из cmd то скорее всего у нас появится окно, которое будет висеть пока не проиграется файл. От него как нибудь можно избавится? 

3 в скрипте который я написал пользователь может запустить несколько раз один и тот же процесс. Все процессы удаленные, поэтому параметр taskkill /im имя_процесса не подходит. Нужно как то узнать каждый раз при запуски процесса его pid. Думал в начале выводить содержимое tasklist в файл, в файле сортировать нужные мне процессы (процессы всегда отображаются в порядке их включения). Но в cmd как то не удобно работать с файлами и строками. Может быть есть какие нибудь варианты узнавать pid вновь запущенного процесса??
PM MAIL   Вверх
Akina
Дата 26.2.2011, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 42
Всего: 454



1.
Код

IF /?

2. Используй cscript хост.
3. Вот почему нужно использовать батники, когда есть VBS/JS/PS-скрипты? 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
01MDM
Дата 26.2.2011, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



Цитата

Как я понял в cmd невозможно воспроизводить звук

Можно:
Код

@echo off
echo [char] 0x7

Где '[char] 0x7' заменяешь соответстветствующим символом.
Цитата

например в нормальных языках программирования

Это две разные ниши. Иногда удобней накатать пакетный файл со списком команд и примитивными условиями, чем писать отдельную тулзу.


--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 26.2.2011, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Но как раз сейчас мне быстрее и удобнее накатать bat файл чем писать на bat файлах. If с отрицанием нужен всего лишь для удобства. Использование vbs js ps для поставленной задачи не нужны

Это сообщение отредактировал(а) MrDmitry - 26.2.2011, 14:23
PM MAIL   Вверх
mihanik
Дата 26.2.2011, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 61
Всего: 109



MrDmitry!!!

Цитата(MrDmitry @  26.2.2011,  02:24 Найти цитируемый пост)
Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long > beep.vbs


Глупость написали.
В VBS все переменные не типизированы!
VBA или VB6 - да.



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
MrDmitry
Дата 26.2.2011, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



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

Код

@echo

set basic=basic.vbs
set sound=c:\1.wav

ECHO Set Obj = CreateObject("WScript.Shell") >>%basic%
ECHO.Obj.Run """C:\Program Files\Windows Media Player\wmplayer.exe"" ""%sound%""", 0 >>%basic% 
start %basic%
@ping 127.0.0.1 -n 2 2> nul > nul 
del %basic%
pause


также разобрался с if конструкцией 

Код

if NOT строка1 == строка2 ( )


А вот с pid процесса все не как не могу разобраться. сейчас делаю так

Код

TASKLIST /NH /FI "WINDOWTITLE eq title окна" >>dat.TXT


в итоге получаю файлик только с нужными мне процессами и pid. Причем процессы в файле расположены в точности в порядке их запуска. Но теперь как то нужно удалить все не нужное оставив только имя и pid процесса. А обрабатывать все это дело в bat файле я не знаю как

Это сообщение отредактировал(а) MrDmitry - 26.2.2011, 20:10
PM MAIL   Вверх
01MDM
Дата 26.2.2011, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



MrDmitry,
Цитата

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

Я думал нужен beep.

А не проще:
Код

@echo off
start "" "C:\1.wav"

Цитата

Но теперь как то нужно удалить все не нужное оставив только имя и pid процесса.

Код

@echo off
for /f "tokens=1,2" %%i in ('tasklist /nh /fi "windowtitle eq sometitle"') do 1>>dat.txt echo %%i %%j

 


--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 26.2.2011, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Цитата(01MDM @ 26.2.2011,  20:30)
MrDmitry,
Цитата

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

Я думал нужен beep.

А не проще:
Код

@echo off
start "" "C:\1.wav"

Цитата

Но теперь как то нужно удалить все не нужное оставив только имя и pid процесса.

Код

@echo off
for /f "tokens=1,2" %%i in ('tasklist /nh /fi "windowtitle eq sometitle"') do 1>>dat.txt echo %%i %%j

@echo off
start "" "C:\1.wav"
не проще, так открывается проигрыватель и воспроизводит файл. А мой способ просто воспроизводит звук файл без всяких видимых окон.

за код спасибо
PM MAIL   Вверх
MrDmitry
Дата 27.2.2011, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



возник еще вопросик

код 
Код

for /f "tokens=1,2" %%i in ('tasklist /nh /fi "windowtitle eq sometitle"') do 1>>dat.txt echo %%i %%j

хорошо работает. А как можно изменить определенную строку, удалить, или записать в переменную? Нужная строка заранее известна. Пробовал конструкцию 

Код

@Echo off
for /F "tokens=*" %%i IN (dat.txt) DO (
set /a n=n+1
if "%n%"=="3" (
echo %i%
)
)
pause


Но она не работает ((
PM MAIL   Вверх
01MDM
Дата 27.2.2011, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



MrDmitry, 
Если ты все хочешь сделать в теле цикла, и устанавливаешь переменные и сразу к ним обращаешься, то необходимо включить отложенное расширение переменной среды. В твоем примере:
Код

@echo off
setlocal enabledelayedexpansion

for /f "tokens=*" %%i in (dat.txt) do (

    set /a n+=1
    if !n! equ 3 echo %%i

)
1>nul pause


Если надо взять только третью строку, то можно так:
Код

@echo off

for /f "skip=2 tokens=*" %%i in (dat.txt) do echo %%i && goto:next

:next
pause 1>nul



--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 28.2.2011, 03:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



У меня еще один самый последний вопрос и мой скрипт будет готов ))

Собственно есть файл структуры

Код

1 27022 1111
2 27023 3333
3 27024 6666
4 27025 2323



Удаляю третью строку

Код

type dat.txt | findstr /i /v "3" > temp.txt
del dat.txt
rename temp.txt dat.txt


Остается


Код

1 27022 1111
2 27023 3333
4 27025 2323 


Теперь мне нужно добавить еще одну строку но чтоб нумерация продолжилась со второго столца

Код

1 27022 1111
2 27023 3333
3 27025 2323 
4 27026 8768


Попробовал сделать так

Код

setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (dat.txt) do  set /a abc+=1
for /f "tokens=2" %%i in (dat.txt) do (
    set /a ka+=1
    if !ka! equ %abc% set count_two=%%i
    ) 

set count=0
FOR /F "TOKENS=*" %%A IN (dat.txt) DO CALL :_SOMELABEL %%A 
GOTO :END 
 
:_SOMELABEL 
SET /a count_two+=1
SET /a count+=1 
ECHO %count% %count_two% %*>>dat.txt
:END


Мой способ начинает нумеровать с начало. То есть получаем

Код

1 27022 1111
2 27023 3333
3 27024 2323 
4 27025 8768


А как сделать как мне нужно? Чтоб нумерация продолжала записываться в файл с последнего значения второго столбца?
PM MAIL   Вверх
01MDM
Дата 28.2.2011, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



MrDmitry,

Цитата

Собственно есть файл структуры
Код
    
1 27022 1111
2 27023 3333
3 27024 6666
4 27025 2323


Код

@echo off
setlocal enabledelayedexpansion

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

for /f "tokens=1-3" %%i in (dat.txt) do (
     
     set /a cnt+=1
     if not %%i equ 3 (1>>temp.dat echo !cnt! %%j %%k) else (set /a cnt-=1)

)

move temp.dat dat.txt

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



--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 28.2.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Ну смотри. Я получаю список запущенных процессов по имени окна

Код

аor /f "tokens=1,2" %%i in ('tasklist /nh /fi "windowtitle eq titile"') do 1>>dat1.txt echo %%j
CALL :SERVWRITE


Затем формирую список

Код

номер   порт    pid
1          28024   989
2          28025   745
3          28026   3245


то есть беру pid из файла dat1.txt и нумерую его
Код

REM ЗАПИСЫВАЕМ ПОРТ И PID СЕРВЕРА
:SERVWRITE
DEL dat.txt
set counts=27023
set count=0
FOR /F "TOKENS=*" %%A IN (dat1.txt) DO CALL :_SOMELABEL %%A 
GOTO :END 
  
:_SOMELABEL 
SET /a counts_serv+=1
SET /a count+=1 
ECHO %count% %counts_serv% %*>>dat.txt
if exist dat1.txt del dat1.txt

:END


Теперь предположим я уничтожаю процесс 2 с pid 745

Код

:Run1
setlocal enabledelayedexpansion
for /f "tokens=3" %%i in (dat.txt) do (
    set /a k+=1
    if !k! equ %answer_off% (
    taskkill /pid %%i
    type hlds.txt | findstr /i /v "%%i" > temp.txt
del hlds.txt
rename temp.txt dat.txt
    )
)


Получается что в файле остается 

Код

номер   порт    pid
1          28024   989
3          28026   3245


А через некоторое время я запускаю новый процесс с новым портом

Код

set /a sum_port+=1
start crash.exe -port %sum_port%
@ping 127.0.0.1 -n 2 2> nul > nul
for /f "tokens=1,2" %%i in ('tasklist /nh /fi "windowtitle eq titile"') do 1>>dat1.txt echo %%j


И нужно чтоб получился файлик 

Код

номер   порт    pid
1          28024   989
2          28026   3245
3          28077   3524

Как я пытаюсь осуществить писал выше, но мой способ начинает нумерацию заново (((((

Вывожу список для уничтожения процесса так 


Код

if "%answer%" == "3" (
cls
ECHO.
ECHO Выберите порт для отключения
setlocal enabledelayedexpansion
for /f "tokens=1,2" %%i in (dat.txt) do (
    set /a n+=1
    echo %%i %%j
)
Echo 0. Выход
set /p answer_off=Сделайте ваш выбор:
call :Run1
)


Если банально, то все эти манипуляции я делаю для того чтобы узнать pid выбранного процесса и его уничтожить. Может быть есть и более легкий способ осуществить мою затею, но мне в голову пришел только такой вариант

Это сообщение отредактировал(а) MrDmitry - 28.2.2011, 12:37
PM MAIL   Вверх
01MDM
Дата 28.2.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 10.5.2008
Где: Default City

Репутация: 29
Всего: 29



MrDmitry,
А откуда берется порт?
Вот, как пример, вариант с калькуляторами без файла-списка. Сначала запускаем:
Код

C:\> for /l %i in (1,1,9) do start calc

Сам батник:
Код

@echo off
setlocal
1>nul chcp 1251

echo #  PID
echo - -----

for /f "tokens=2" %%i in (' tasklist /nh /fi "windowtitle eq Калькулятор" ') do call:set %%i

for /f "tokens=2,3 delims=_=" %%i in (' set apps_ ') do echo %%i  %%j
echo -----
set /p choice="Завершить процесс (по номеру): "

for /f "tokens=2 delims==" %%i in (' set apps_%choice% ') do taskkill /pid %%i
goto:eof

:set
set /a cnt+=1
set "apps_%cnt%=%1"



--------------------
Вопросы в личке останутся без ответов.
PM MAIL   Вверх
MrDmitry
Дата 1.3.2011, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



вот так берется порт

Код

if "%answer%" == "1" (
cls
set /a sum_port=sum_port + 1
start crash.exe -port %sum_port%
)


то есть при каждом запуске порт увеличивается на 1


Твой пример с калькулятором у меня не работает (

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Windows"
December
bartram
Akella

Запрещается!

1. Обсуждать взлом и делиться кряками

2. Способствовать созданию и распространению вирусов

  • Для бессмертных бородатых вопросов типа Win vs Nix есть специальный форум Религиозные Войны
  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • ВСЕГДА УКАЗЫВАЙТЕ ВЕРСИЮ ОС

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, December, bartram, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Windows | Следующая тема »


 




[ Время генерации скрипта: 0.0678 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.