Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/1999: Рейтинг темы: голосов - 1999, средняя оценка - 4.60
Dragokas
Эксперт WindowsАвтор FAQ
17168 / 7222 / 865
Регистрация: 25.12.2011
Сообщений: 11,016
Записей в блоге: 16
1

Полезные BAT/CMD скрипты

15.10.2012, 00:56. Просмотров 397395. Ответов 167

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

Также приветствуются скрипты высокой степени сложности, полезные с точки зрения
изучения принципа их работы.

Правила темы:
  • При выкладывании скрипта постарайтесь тщательно описывать принцип его работы и по-больше комментировать строки Вашего кода.
  • Код, состоящий из > 4 строк, помещайте под теги [SPOILER="Развернуть код..."]Ваш код[/SPOILER]. Также можно сделать 2 варианта: 1. Чистый код. 2. С комментариями.
  • Запрещаются любые обсуждения выложенных здесь работ;
  • если в этом есть необходимость, создайте отдельную тему в которой опишите замечание или проблему при работе с данным скриптом, указав ссылку на сообщение из этой темы (правый клик по слову "Permalink" вверху каждого сообщения).
  • Если Вы хотите внести исправление в выложенный Вами код - пишите мне в личку ссылку на Ваше старое сообщение и новый исправленный вариант. (полный вариант с тегами Вашего старого сообщения можно получить, нажав на него - кнопка "Цитата").
  • Допускается размещение обзора программ, помогающих редактировать/отлаживать код.


Схожая тема: BAT/CMD файлы
Смежная тема: Полезные VBS скрипты и программы по работе с ними
Ссылка на набор полезных скриптов (предыдущая шапка от bombus) BAT/CMD файлы


******************* Перечень полезных скриптов: *******************

Архивация и резервное копирование
Создание CAB-архивов ссылка

Безопасность
Удаление последствий вируса (фейковые папки на флешке) ALINK
Стать владельцем папки/файла, получить полные права (пункт контекстного меню (Reg-файл) ALINK
Смена владельца и прав на папку и ее содержимое, в которой запущен батник (Full Access <-> Read Only) ссылка

Дата, время
Конвертация даты/времени из/в UNIX-формат(в секундах после 1-янв-1970 00:00:00) ссылка

Интерфейс
Крутящаяся палка (имитация) ссылка
Вызов GUI диалогового окна выбора папки ссылка
Разноцветный вывод в консоли. ссылка Цветная роза. ссылка
Диалоговое меню выбора файла ссылка

Компиляция
Помощник компиляции исходных кодов С# (.cs) через консольный NET.FrameWork компилятор ссылка

Операционная система
Восстановление шрифтов после сбоя ссылка
Пищалка (сигнал встроенного динамика, подобие Beep) ссылка
Регистрация всех библиотек DLL и OCX ссылка
Проверка целостности системных файлов утилитой sfc /scannow с выводом лога и автоопределением месторасположения диска ссылка

Сеть
Подсчёт маски подсети на основании двух крайних значений диапазона. ALINK
Пакетное получение информации о IP-адресах и построение HTML-отчёта. ALINK
GetIP/GetMAC/Get default gateway ссылка

Процессы
Завершение процесса (с листингом и выбором через меню) ссылка
Многопроцессное создание пустых файлов (бенчмарк для винчестера) ссылка
Отслеживание зависшего процесса и его перезапуск с указанным приоритетом ссылка
Process Change Monitor (мониторинг и протоколирование изменений в списке запущенных процессов) ссылка

Текстовые операции, кодировка
Вывод текста без переноса на новую строку ALINK
Перекодировка CP OEM-866 <-> WIN-1251 - 1) CMD 2) VBA 3) ASM (exe+src) ссылка
Помощь по всем командам вашей версии Windows / DOS ссылка
Транслитерация файлов, в именах которых есть кириллица (файловые операции) ссылка
Преобразование текстового файла в кодировку Unicode (файловые операции) ссылка
Перекодировщик Reversed Hex в символьную строку ссылка

Файловые операции, разделы
Взаимное копирование содержимого 2 папок друг в друга ALINK
Прогресс-бар копирования файлов ссылка
Циклическое копирование файлов по каталогам с ожиданием завершения их дозаписи в исходную папку. ссылка
Создание нуль-копии папки для выкладывания на форуме ссылка
Получение серийного номера всех съемных устройств и физических жестких дисков (не разделов). Получение имен разделов физических накопителей (кроме оптических). ссылка

Другое
Расчёт индекса массы тела и идеального веса ссылка
21
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2012, 00:56
Ответы с готовыми решениями:

Batch (CMD/BAT) несколько заданий на CMD/BAT
1.Напишите bat файл на диске с ,который будет искать на всех дисках файлы с расширением...

CMD/BAT - Bat для запуска приложения при падении нагрузки ЦП другого процесса
Суть вопроса: есть батник запуска приложения @echo off start /d&quot;C:\Program...

Как запустить bat файл командой cmd /k передав bat файлу дополнительные аргументы
Как передать bat файлу, запускаемому через cmd /k аргументы? Это был первый вопрос, а теперь вот...

Bat/cmd
Добро утро. Директор придумал просто одну вещь. Изложу ситуацию. У меня есть папка obchee_s_ras...

167
greg zakharov
Покинул форум
2401 / 991 / 281
Регистрация: 07.05.2015
Сообщений: 1,991
11.05.2015, 17:44 81
Имитация GACView с переданным ей ключом /l (без дополнительных проверок).

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@echo off
  setlocal enabledelayedexpansion
    set "key=HKLM\SOFTWARE\Microsoft\Fusion\GACChangeNotification\Default"
    set "num=0"
    echo.The Global Assembly Cache contains the following assemblies:
    for /f "skip=4" %%i in (
      'reg query %key% ^| findstr /v /irc:"StoreChangeID"'
    ) do (
      for /f "tokens=1,2,3,4,5 delims=," %%j in ("%%i") do (
        set "clt=%%l"
        if "!clt:~2,1!" neq "" (
          set "clt=neutral"
          set "tok=%%l"
          set "arc=%%m"
        ) else (
          set "tok=%%m"
          set "arc=%%n"
        )
        echo   %%j, Version=%%k, Culture=!clt!, PublicKeyToken=!tok!, ProcessorArchitectute=!arc!
      )
      set /a "num+=1"
    )
    echo.
    echo.Number of items = !num!
  endlocal
exit /b
Аптайм системы с учетом спеифики Windows:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off
  setlocal
    chcp 1251>nul
    set "u=0"
    for /f "tokens=2 delims=" %%i in (
      '2^>nul reg query HKU ^| findstr /iv "classes .default"'
    ) do set /a "u+=1"
    for /f "tokens=1,2 delims=," %%i in (
      'typeperf "\Система\Время работы системы" -sc 1 ^| findstr /rc:"\:"'
    ) do (
      set "cur=%%i"
      set "sec=%%j"
    )
    set "sec=%sec:"=%"
    for /f "tokens=1 delims=." %%i in ("%sec%") do set "t=%%i"
    set /a "ss=t%%60", "t/=60", "mm=t%%60", "t/=60", "hh=t%%24", "dd=t/24"
    if %hh% lss 10 set "hh=0%hh%"
    if %mm% lss 10 set "mm=0%mm%"
    if %ss% lss 10 set "ss=0%ss%"
    echo.%cur:~12,8% up %dd% days, %hh%:%mm%:%ss%, %u% users
  endlocal & chcp 866>nul
exit /b
Комментарий модератора Dragokas
В Windows Vista и выше код необходимо сохранять в кодировке Windows-1251, либо убрать строку с командой chcp 1251


Добавлено через 7 часов 20 минут

Не по теме:

Уважаемый, Dragokas! Видимо я счастливый обладатель некой фантастической триальной версии Win7, живущей под VirtualBox, если не указывая chcp 1251 явным образом (при сохранении файла в кодировке 1251), батник не выводит ровным счетом ничего. Или это сомнение в моей компетентности?

3
Dragokas
11.05.2015, 18:08  [ТС]
  #82

Не по теме:


Ув. greg zakharov, никоим образом не хотел Вас обидеть.
У нас в разделе принято, что все батники должны по-умолчанию сохраняться в кодировке OEM-866,
поэтому Ваше утверждение не противоречит моему замечанию.
Если код не может работать с OEM-866, это следует явно указывать.
P.S. Для обсуждения просьба использовать соответствующую тему или ЛС.

0
alpap
2985 / 1703 / 571
Регистрация: 26.04.2015
Сообщений: 5,644
02.07.2015, 03:36 83
Создание URL-ярлыка файла.

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
set "full=C:\Windows\notepad.exe"
set "shortcut=%full:\=/%"
for %%i in ("%full%") do (
 set "name=%%~ni"
)
(
echo [InternetShortcut]
echo url="file:///%shortcut%"
echo IconFile="%full%"
echo IconIndex=0
)>"%name%.url"
exit /b
.
1
an01
38 / 20 / 1
Регистрация: 24.06.2015
Сообщений: 20
28.07.2015, 13:22 84
Слежение за свободным местом на диске.

Отчет обновляется каждые 2 сек.

Windows Batch file
1
2
3
4
5
6
7
@echo off
:start
cls
echo.
wmic logicaldisk where "Caption>'B:' and DriveType<>5" get Caption,DriveType,FileSystem,FreeSpace,Size,VolumeName
pathping -h 1 -p 2000 -q 1 -w 1 localhost 1>nul
goto start
Исключены дискеты ( A:, B: ) и компакт-диски (DriveType<>5).
0
Вложения
Тип файла: zip место на дисках непрерывно.zip (326 байт, 66 просмотров)
an01
38 / 20 / 1
Регистрация: 24.06.2015
Сообщений: 20
10.08.2015, 12:17 85
Список компьютеров подсети и проверка соединения.

Windows Batch file
1
2
3
@echo off
for /f "delims=\\, " %%A in ('net view ^| find "\"') do (for /f "delims=" %%B in ('ping -n 1 /l 1 /w 1000 %%A ^| find "TTL=" ^|^| echo  -') do echo  %%A : %%B)
cmd /k
0
Вложения
Тип файла: zip компьютеры подсети.zip (323 байт, 129 просмотров)
Olegtrick78
2 / 2 / 0
Регистрация: 06.08.2015
Сообщений: 12
14.08.2015, 15:59 86
Всем привет. Почитал о том , как ставить Windows 10 на флешку ( Win to GO ) , и решил автоматизировать этот непростой для некоторых процесс . В папке должен лежать Install.wim , конвертированый из install.esd , утилита imagex.exe , и батник запуска . Вот код
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
@echo off
title Установщик Windows 7/8/10 на флешку [By Oleg Gyunter]
color 3e
 
pause
echo ------------------------------------------------------------
echo [ .       Первый этап - подготовка Флешки                   ]
echo [ .  Вам необходимо выбрать НОМЕР диска флешки ,            ]
echo [ .  она будет форматирована.  НЕ ПЕРЕПУТАЙТЕ !!!!          ]
echo [ .        ВВЕДИТЕ букву и нажмите  ENTER                   ]
echo ------------------------------------------------------------
 
mkdir %cd%\config
attrib +H %cd%\config
 
echo list disk > %cd%\config\list.txt
DiskPart /s %cd%\config\list.txt
echo ...................................
set /p a=Выберите НОМЕР Диска:
Echo Вы выбрали %a%
echo Продолжить ?
echo .
 
pause
if "%a%"=="1" goto 1
if "%a%"=="2" goto 2
if "%a%"=="3" goto 3
if "%a%"=="4" goto 4
if "%a%"=="5" goto 5
 
:1
echo select disk 1 > %cd%\config\2list.txt
DISKPART /s %cd%\config\2list.txt
goto metka
:2
echo select disk 2 > %cd%\config\2list.txt
DISKPART /s %cd%\config\2list.txt
goto metka
:3
echo select disk 3 > %cd%\config\2list.txt
DISKPART /s %cd%\config\2list.txt
goto metka
:4
echo select disk 4 > %cd%\config\2list.txt
DISKPART /s %cd%\config\2list.txt
goto metka
:5
echo select disk 5 > %cd%\config\2list.txt
DISKPART /s %cd%\config\2list.txt
goto metka
:metka
 
echo Сейчас пакет команд
pause
 
echo clean >> %cd%\config\2list.txt
echo create partition primary >> %cd%\config\2list.txt
echo format fs=ntfs quick >> %cd%\config\2list.txt
echo active >> %cd%\config\2list.txt
 
DISKPART /s %cd%\config\2list.txt
if %errorlevel%==0 goto wait5
:wait5
echo . ПЕРВЫЙ ЭТАП ПРОШЕЛ УСПЕШНО !!
pause
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
echo ------------------------------------------------------------
echo [ .   Теперь будет работать распаковка                      ]
echo [ . Вам необходимо выбрать БУКВУ вашей флешки ,             ]
echo [ .      для распаковки на неё образа.                      ]
echo [ .    ВВЕДИТЕ букву и нажмите  ENTER                       ]
echo ------------------------------------------------------------
for %%i in (c d e f g h i j k l m n) do fsutil fsinfo drivetype %%i:
echo ...................................
set /p x=Выберите БУКВУ Диска:
Echo Вы выбрали %x%
echo Продолжить ?
echo .
pause
 
imagex /apply install.wim 1 %x%:
 
pause
echo ----------------------------------------------------------
echo [ .   Теперь будет установлен загрузчик                   ]
echo [ . Вам необходимо выбрать БУКВУ вашей флешки ,           ]
echo [ .      для установки загрузчика.                        ]
echo [ .    ВВЕДИТЕ букву и нажмите  ENTER                     ]
echo ----------------------------------------------------------
for %%i in (c d e f g h i j k l m n) do fsutil fsinfo drivetype %%i:
set /p z=Выберите БУКВУ Диска:
Echo Вы выбрали %z%
echo Продолжить ?
echo .
echo .
pause
 
bcdboot %z%:\windows /s %z%:
 
 
 
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
if exist %cd%\config\list.txt del /Q %cd%\config\list.txt
if exist %cd%\config\2list.txt del /Q %cd%\config\2list.txt
 
rmdir /Q %cd%\config
 
 
exit
1
Dragokas
Эксперт WindowsАвтор FAQ
17168 / 7222 / 865
Регистрация: 25.12.2011
Сообщений: 11,016
Записей в блоге: 16
14.08.2015, 20:07  [ТС] 87
Это можно сделать без распаковки образа.
Microsoft уже все предусмотрела в программе установщике-Downloader-е Media Creation Tool.
1
vavun
10495 / 5459 / 859
Регистрация: 07.04.2013
Сообщений: 15,663
13.09.2015, 03:05 88
Фон для экрана входа в систему в Windows 7 всегда будет таким же, как и текущий фон рабочего стола.


Windows Batch file
1
2
3
4
5
6
7
@echo off
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background /v "OEMBackground" /t REG_DWORD /d 1 /f
set WALLPAPER="%APPDATA%\Microsoft\Windows\Themes\TranscodedWallpaper.jpg"
set OOBE="%SYSTEMROOT%\System32\oobe\info\backgrounds"
if not exist %OOBE% md %OOBE%
mklink %OOBE%\backgroundDefault.jpg %WALLPAPER%
exit 0
Совершенно ничего особенного или полезного, зато наглядно демонстрирует особенности символьных или жёстких ссылок )

Единственное ограничение - размер изображение не должен превышать 256 КБ. А точнее размер его перекодированного варианта TranscodedWallpaper.jpg

В данном случае вариант с жесткой ссылкой mklink /h так же работает.
2
vavun
10495 / 5459 / 859
Регистрация: 07.04.2013
Сообщений: 15,663
13.09.2015, 04:42 89
Автоматически меняем цвет cmd.exe в зависимости от того, с какими правами было запущено

Прописываем в реестр параметр AutoRun со значением at >nul && (color 0C) || (color 0A)
В раздел [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]
Windows Batch file
1
reg add "HKLM\Software\Microsoft\Command Processor" /v "AutoRun" /t REG_SZ /d "at >nul && (color 0C) || (color 0A)"
Результат
Полезные BAT/CMD скрипты


Теперь при запуске с обычными правами командная строка будет иметь зеленый текст на черном фоне,
А при запуске с правами администратора красный текст на черном фоне.
Дополнительных действий для того, чтобы все работало не требуется.


Можно так же заголовок при помощи title

Windows Batch file
1
reg add "HKLM\Software\Microsoft\Command Processor" /v "AutoRun" /t REG_SZ /d "at >nul && (title Администратор && color 0C) || (title Пользователь && color 0A)"
Полезные BAT/CMD скрипты


Или очистить очистить командную от приветствия
Windows Batch file
1
reg add "HKLM\Software\Microsoft\Command Processor" /v "AutoRun" /t REG_SZ /d "cls && at >nul && (title Администратор && color 0C) || (title Пользователь && color 0A)"
Полезные BAT/CMD скрипты


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


UPD !--------------


Огромное спасибо за замечание уважаемому ComSpec.

Команду AT начиная с windows 8 уже не удастся использовать для проверки наличия прав администратора.

Универсальный вариант для windows 7, 8.1, 10 (скорее всего и vista)

Windows Batch file
1
reg add "HKLM\Software\Microsoft\Command Processor" /v "AutoRun" /t REG_SZ /d "reg query "HKEY_USERS\S-1-5-19\Environment" /v TEMP 2>&1 | findstr /I /C:"REG_EXPAND_SZ" 2>&1 > NUL && (color 0C) || (color 0A)"

Пример работы в Windows 8.1 и Windows 10
Полезные BAT/CMD скрипты
Полезные BAT/CMD скрипты
6
Garry Galler
2954 / 2256 / 796
Регистрация: 28.10.2013
Сообщений: 5,819
15.09.2015, 22:14 90
Скрипт шифровки\дешифровки произвольной строки в\из base64.
Идея не новая, но, так уж вышло, эту "америку" открыл случайно... сам... как и Колумб
Аналогичного скрипта на форуме вроде нет, поэтому пусть будет.
Кликните здесь для просмотра всего текста
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@echo off
setlocal enabledelayedexpansion
::===================================
:: Скрипт шифровки\дешифровки произвольной строки в\из base64
:: Файл скрипта нужно сохранять в OEM 866, иначе в cmd получите некорректную кириллицу
:: Для всех операций используется встроенная в windows 7\8 утилита certutil.exe
::===================================
 
::===================================
:: пример шифровки строки в base64
::===================================
call :code "-encode" "Однажды в студеную зимнюю пору я из лесу вышел; был сильный мороз."
rem set "str=Однажды в студеную зимнюю пору я из лесу вышел; был сильный мороз."
rem call :code "-encode" "%str%"
@echo %encstr%
pause>nul
 
::===================================
:: пример расшифровки строки из base64
::===================================
rem call :code "-decode" "%encstr%"
call :code "-decode" "jqStoKak6yCiIOHi46SlrePuIKeorK3u7iCvruDjIO8gqKcgq6Xh4yCi6+ilqzsgoeurIOGoq+yt66kgrK7grqcu"
@echo %encstr%
pause>nul
exit /b
 
::===================================
:: основной код, который выполняет шифровку\дешифровку
::===================================
:code
if exist %temp%\*.base64 del /f %temp%\*.base64>nul
set encstr=
rem @echo %~2>%temp%\tmp1.base64
:: так запись строки в файл будет без ненужного перевода строки
<nul set /p "a=%~2">%temp%\tmp1.base64
  certutil %~1 %temp%\tmp1.base64 %temp%\tmp2.base64>nul
    for /f "eol=- delims=" %%i in (%temp%\tmp2.base64) do (
      set encstr=!encstr!%%i
    )
  del /f %temp%\*.base64>nul
goto :eof
2
greg zakharov
Покинул форум
2401 / 991 / 281
Регистрация: 07.05.2015
Сообщений: 1,991
17.09.2015, 18:14 91
Очень часто приходится использовать subst, но чтобы не заморачиваться с буквой монтируемого диска, набросал следующий командный сценарий (mount.cmd):
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@echo off
  setlocal enabledelayedexpansion
    set "i=0"
    for %%i in (%*) do set /a "i+=1"
    if "!i!" neq "1" echo.Index is out of range.&goto:eof
    
    for /f "tokens=4" %%i in (
      '2^>nul dir /a:d %1 ^| findstr /irc:"\.$"'
    ) do set "fld=%%i"
    if "!fld!" neq ".." echo.Directory does not exist.&goto:eof
    
    for /f "tokens=1" %%i in (
      'reg query HKLM\SYSTEM\MountedDevices ^| findstr /irc:"dos" ^| sort'
    ) do set "ltr=%%i"
    set "ltr=!ltr:~-2,1!"
    
    for /f "delims=:" %%i in ('subst') do set "sub=%%i"
    for /l %%i in (65, 1, 90) do (
      cmd /c exit /b %%i
      if "!sub!" equ "" if "!=exitcodeascii!" equ "!ltr!" (
        set /a "i=0x!=exitcode!+1"
      )
      if "!sub!" equ "!=exitcodeascii!" (
        set /a "i=0x!=exitcode!+1"
      )
    )
    cmd /c exit /b !i!
    subst !=exitcodeascii!: %1
  endlocal
exit /b
И соответсвенно dismount.cmd:
Windows Batch file
1
@for /f "delims=\" %%i in ('subst') do @subst %%i /d
Примеры:
Код
E:\proj>mount .
E:\proj>subst
G:\: => E:\proj

E:\proj>mount C:\User\Administrator\Desktop
E:\proj>subst
G:\: => E:\proj
H:\: => C:\User\Administrator\Desktop
1
Dragokas
Эксперт WindowsАвтор FAQ
17168 / 7222 / 865
Регистрация: 25.12.2011
Сообщений: 11,016
Записей в блоге: 16
18.09.2015, 10:39  [ТС] 92
Запуск нескольких процессов с указанием таймаута для каждого.

Демка в архиве.

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@set @x=0 /*
@echo off
SetLocal EnableExtensions
 
::set "BaseFolder=C:\XWeb\Human Emulator"
::set AppName=XWeb.exe
set ScriptPath=C:\XWeb\free_blogs
 
set "BaseFolder=%~dp0Test "
set AppName=XWeb.exe
 
set Arr[7010][0]=name1
set Arr[7010][1]=10
set Arr[7011][0]=name2
set Arr[7011][1]=20
set Arr[7012][0]=name3
set Arr[7012][1]=30
 
:begin
echo -----------------
wmic process get ExecutablePath, CreationDate > task.txt
:: Просмотр массива
For /F "tokens=2 delims=[]" %%a in ('set Arr[') do (
  rem Парсинг времени старта конкретного процесса
  set ProcessExist=
  For /F "delims=." %%b in ('find /i "%BaseFolder%%%a\%AppName%" ^< task.txt') do (
    call call :IsOutOfTime "%%b" %%Arr[%%a][1]%% %%a&& (set "ProcessExist=true") || wmic process where "ExecutablePath='%BaseFolder:\=\\%%%a\\%AppName%'" call terminate
  )
  if not Defined ProcessExist if exist "%BaseFolder%%%a\%AppName%" (
    rem Двойная проверка
    wmic process get ExecutablePath |>NUL find /i "%BaseFolder%%%a\%AppName%" || (
      rem Задержка 500 мс.
      cscript //nologo /e:jscript "%~f0" 500
      wmic process get ExecutablePath |>NUL find /i "%BaseFolder%%%a\%AppName%" || (
        call start "XHE" "%BaseFolder%%%a\%AppName%" /port:"%%a" /script:"%ScriptPath%\%%Arr[%%a][0]%%.php" /script_args:"%%a"
      )
    )
  )
)
ping -n 2 127.1 >NUL
goto :begin
goto :eof
 
:IsOutOfTime %1-Process time, %2-Maximum seconds, %3-optional-Process identifier, Return=1 if out of max time.
  set t0=%~1
  set t1=%t0:~8,2%:%t0:~10,2%:%t0:~12,2%,00
  set t2=%time%
  for /F "tokens=1-8 delims=:.," %%a in ("%t1: =0%:%t2: =0%") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000, a/=100"
  echo %AppName% [%3]. Sec/Kill = %a%/%~2
if %a% GTR %~2 (exit /B 1) else (exit /B 0)
 
*/ if(isFinite(WScript.Arguments(0))) WScript.Sleep(WScript.Arguments(0));
3
Вложения
Тип файла: zip restart_proc.zip (16.0 Кб, 32 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
17168 / 7222 / 865
Регистрация: 25.12.2011
Сообщений: 11,016
Записей в блоге: 16
18.09.2015, 10:44  [ТС] 93
Перезапуск PPPoE подключения, пока не изменится IP-адрес.

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
@set @x=0; /*
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
:: Данные аутентификации
set connection="2"
set "login=XXX"
set "psw=XXX"
 
:: Количество секунд задержки до перезагрузки соединения PPPoE
set Delay=900
 
:: Повышение привилегий
net session 2>NUL 1>&2 || if "%~1"=="" (cscript.exe //nologo //e:jscript "%~f0"& exit /b)
 
ver |>NUL find "6." && set "Sleep=TIMEOUT /T %Delay%" || set "Sleep=ping -n %Delay% 127.1 >NUL"
 
set "connection=%connection:"=%"
set "login=%login:"=%"
set "psw=%psw:"=%"
 
:Loop
call :GetIP LastIP
call :BeginConnect
call :GetIP CurrIP
if "%CurrIP%"=="%LastIP%" (
  echo IP-адрес не изменился.
  goto :Loop
)
%Sleep%
goto Loop
 
:BeginConnect
  echo Разрываем соединение "%connection%"
  rasdial "%connection%" /DISCONNECT
  ping -n 2 127.1 >NUL
  set connected=0
  rasdial "%connection%" "%login%" "%psw%"
  echo %date% %time% "%connection%" cоединение установлено.
  ping -n 2 127.1 >NUL
  :: Проверка успешности подключения
  for /f "delims=" %%i in ('rasdial') do if "%%i"=="%connection%" set connected=1
  if %connected%==0 (
    echo %date% %time% "%connection%" cоединение не обнаружено. Соединяемся...
    goto BeginConnect
  )
Exit /B
 
:GetIP
  for /f "tokens=1-2 delims=:(" %%i in ('ipconfig /all^|findstr /i /c:"PPP %connection%" /c:"IPv4"') do (
    set "BF=!Last!"& set Last=%%i
    for /F %%a in ("%%j") do echo !BF!|find /i "PPP %connection%" && set "IP=%%a"
  )
:ext
  echo IP="%IP%"
  set "%~1=%IP%"
Exit /B
 
*/new ActiveXObject('Shell.Application').ShellExecute (WScript.ScriptFullName,'Admin','','runas',1);
2
greg zakharov
Покинул форум
2401 / 991 / 281
Регистрация: 07.05.2015
Сообщений: 1,991
18.09.2015, 18:58 94
Со времен изучения API известного многим сервиса VirusTotal остался вот такой гибрид проверки ссылок (vturl.cmd).
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@set @vturl=0 /*
  @echo off
    set @vturl=
    cscript /nologo /e:jscript "%~f0" %*
  exit /b
*/
 
(function(url) {
  String.prototype.toJSON = function() {
    return eval('(' + this + ')');
  }
  
  String.prototype.crop = function() {
    return this.substring(0, this.indexOf('analysis') + 9);
  }
  
  var key = 'f25133d9068704c23335fc39a7351828fa80c5dde894d731d5450cf8ab8569e8',
      lnk = 'https://www.virustotal.com/vtapi/v2/url/', json;
  
  with (new ActiveXObject('WinHTTP.WinHTTPRequest.5.1')) {
    Open('POST', lnk + 'report?apikey=' + key + '&resource=' + url, false);
    Send();
    json = ResponseText.toJSON();
    
    if (json['response_code'] === 0) {
      Open('POST', lnk + 'scan?apikey=' + key + '&url=' + url, false);
      Send();
      json = ResponseText.toJSON();
      WScript.echo(json['verbose_msg'] + '.\nQueue : ' + json['permalink']);
      WScript.Quit(1);
    }
    
    WScript.echo(json['url'] + '\n\tLast scan : ' + json['scan_date'] +
      '\n\tVT Scan   : ' + json['positives'] + '/' + json['total'] +
      '\n\tVT Link   : ' + json['permalink'].crop()
    );
  } //with
}(WScript.Arguments.length !== 1 ? WScript.Quit(1) : WScript.Arguments.Unnamed(0)));
Пример использования:
Код
E:\old>vtkey cracklab.ru
http://cracklab.ru/
        Last scan : 2015-09-15 02:34:01
        VT Scan   : 3/63
        VT Link   : https://www.virustotal.com/url/2f458890fd9b70b1d0583503aba5361228762b9f1883d146992a2f935e046be8/analysis/
0
greg zakharov
Покинул форум
2401 / 991 / 281
Регистрация: 07.05.2015
Сообщений: 1,991
22.09.2015, 07:56 95
Иногда между выполнением некоторых команд требуется создать паузу в N минут. С ping'ом трюк всем знаком, но недостаток в нем, пожалуй, лишь в отсутсвии визуальности, - хотя наверняка при желании можно исправить данную ситуацию, написав много путанного кода на чистом CMD. Речь о таймере обратного отсчета, который бы ликвидировал недостаток неведения выполняется ли командный сценарий или же мерцающий курсор признак зависания или не весть знамо чего. Если без преамбул, то:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@set @ts=0 /*
  @echo off
    set @ts=
    cscript /nologo /e:jscript "%~f0" %*
  exit /b
*/
 
(function(min) {
  for (var i = min * 60, ts = new Date(0, 0, 0, 0, min, 0); i > 0; i--) {
    ts = new Date(ts.setMilliseconds(-1));
    WScript.StdOut.Write(ts.toLocaleTimeString() + '\r');
    WScript.Sleep(1000);
  }
}(
  WScript.Arguments.length !== 1 ? WScript.Quit(1) : parseInt(WScript.Arguments.Unnamed(0))
));
Пример работы (timer.cmd):
Код
E:\sandbox>timer 1
0:00:59...
Далее, с каждой секундой, строка будет менять свое значение на -1 секунду.
Плюсы такого подхода - относительно небольшой код, возможность передавать в качестве аргумента значение в самом командном сценарии:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
@set @ts=0 /*
  @echo off
    set @ts=
    echo First instruction.
    cscript /nologo /e:jscript "%~f0" 1
    echo Second instruction.
    cscript /nologo /e:jscript "%~f0" 3
    echo Off...
  exit /b
*/
...
0
Garry Galler
2954 / 2256 / 796
Регистрация: 28.10.2013
Сообщений: 5,819
22.09.2015, 13:34 96
Вывод системного сообщения в области уведомлений
В одном топике интересовались как можно вывести всплывающее сообщение а-ля "Сетевой кабель не подключен" в области уведомлений. Обычными средствами windows именно такое сообщение практически никак, так как доступ к соответствующим объектам системы есть у компилируемых ЯП, но не у встроенных в windows.
Однако, так как powershell является ключом почти ко всем дверям системы, можно выстроить цепочку bat+powershell+NET и получить желаемое.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<# :
  @echo off
   powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -command ^
     "&{[ScriptBlock]::Create((cat """%~f0""") -join [Char]10).Invoke(@(&{$args}%*))}"
  :: example:  shownotify.cmd 5 'привет. я заголовок!' 'а я сообщение!'
  :: для передачи строк с пробелами использовать только одинарные кавычки
  :: все параметры позиционные - передавать нужно последовательно, без пропусков
  :: уведомление будет начинать исчезать после любого движения мышью, 
  :: по таймеру оно доработает только, если не трогать мышь
  :: скрипт блокирует вызывающий поток(батник) на время отображения уведомления
  :: кодировка батника может быть и 866 и 1251. 
  :: UTF-8 (обычная - c меткой BOM) плохо воспринимается cmd, а UTF-8 с BOM - не воспринимает powershell
  exit /b
#>
 
param (
[Int]
[ValidateScript({$_.GetType().Name -eq "Int32"})]
$time = 20, # время отображения уведомления
$title= "Это текст заголовка не более 64 символов",
$text = "Это текст уведомления длиной не более 255 символов",
$icontext = "Всплывающая подсказка для иконки не более 64 символов"
)
 
Add-Type @"
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;
 
namespace NET {
   
   public class BallonTip {
             
     public static void ShowNotify(int showTime, string titleText, string notifyText, string iconText) 
     {
        showTime *=1000;
        NotifyIcon notifyIcon = new NotifyIcon();
        notifyIcon.Visible = true;
        notifyIcon.Text = iconText;
        notifyIcon.Icon  = SystemIcons.Information;  // иконка значка в трее
        notifyIcon.ShowBalloonTip(showTime, titleText, notifyText,ToolTipIcon.Info );
        Thread.Sleep(showTime);
        notifyIcon.Dispose();
        }
    }
}
"@ -ReferencedAssemblies System.Windows.Forms,System.Drawing
 
[NET.BallonTip]::ShowNotify($time, $title, $text, $icontext)
Пример использования:
Windows Batch file
1
shownotify.cmd 5 'привет. я заголовок!' 'а я сообщение!'
4
greg zakharov
22.09.2015, 15:46
  #97

Не по теме:

Garry Galler, Вы усложняете: можно (да и нужно) не тратить время на генерацию вспомогательной сборки в памяти, а добавить в текущий сеанс PowerShell сборку System.Windows.Forms и использовать нужные типы оттуда напрямую.

0
Garry Galler
2954 / 2256 / 796
Регистрация: 28.10.2013
Сообщений: 5,819
22.09.2015, 20:20 98

Не по теме:

Я именно так и делал. Однако в среде PoSH это работало не так как нужно - поэтому и переделал. Впрочем, в обертке bat, все оказывается, нормально и так работает.


Второй вариант вывода системного сообщения в области уведомлений.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<# :
  @echo off
   powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -command ^
     "&{[ScriptBlock]::Create((cat """%~f0""") -join [Char]10).Invoke(@(&{$args}%*))}"
  :: example:  shownotify.cmd 5 'привет. я заголовок!' 'а я сообщение!'
  :: для передачи строк с пробелами использовать только одинарные кавычки
  :: все параметры позиционные - передавать нужно последовательно, без пропусков
  :: уведомление будет начинать исчезать после любого движения мышью, 
  :: по таймеру оно доработает только, если не трогать мышь
  :: скрипт блокирует вызывающий поток(батник) на время отображения уведомления
  :: если убрать последние две строчки в этом варианте - скрипт перестанет быть блокирующим
  :: но уведомление будет висеть бесконечно, до первого движения мышью
  :: кодировка батника может быть и 866 и 1251. 
  :: UTF-8 (обычная - c меткой BOM) плохо воспринимается cmd, а UTF-8 с BOM - не воспринимает powershell
  exit /b
#>
 
param (
[Int]
[ValidateScript({$_.GetType().Name -eq "Int32"})]
$time = 20, # время отображения уведомления
$title= "Это текст заголовка не более 64 символов",
$text = "Это текст уведомления длиной не более 255 символов",
$icontext = "Всплывающая подсказка для иконки не более 64 символов"
)
 
Add-Type -Assembly System.Windows.Forms
Add-Type -Assembly System.Drawing
$time*= 1000 # время отображения
$notifyIcon = new-object  System.Windows.Forms.NotifyIcon
$notifyIcon.Visible = $true
$notifyIcon.Text = $icontext
$notifyIcon.Icon  = [System.Drawing.SystemIcons]::Information  # иконка значка в трее
$notifyIcon.ShowBalloonTip($time, $title, $text,[System.Windows.Forms.ToolTipIcon]::Info)
# здесь блокируем на время отображения - далее удаляем иконку
sleep -Milliseconds $time
$notifyIcon.Dispose()
Добавлено через 13 минут

Не по теме:

Только сейчас обратил внимание - параметр timeout похоже не оказывает никакого влияния при передаче в функцию ShowBalloonTip, так как msdn пишет что "this parameter is deprecated as of Windows Vista. Notification display times are now based on system accessibility settings." То есть время показа сообщения в данных скриптах зависит исключительно от таймаута, выставленного в блокирующих функциях sleep.

0
greg zakharov
Покинул форум
2401 / 991 / 281
Регистрация: 07.05.2015
Сообщений: 1,991
24.09.2015, 14:35 99
Эдакий аналог UNIX'ового which.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
  setlocal
    set "i=0"
    for %%i in (%*) do set /a "i+=1"
    if "%i%" neq "1" (
      echo.Index is out of range.
      goto:eof
    )
    for %%i in (%pathext%;.CPL;.DLL;.MSC) do (
      for %%j in (%1%%i) do (
        if not "%%~$PATH:j" equ "" echo.%%~$PATH:j
      )
    )
  endlocal
exit /b
IP-адрес без использования ipconfig.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
  setlocal
    set "net=HKLM\SYSTEM\CurrentControlSet\Services"
    set "net=%net%\Tcpip\Parameters\Interfaces"
    for /f "tokens=3" %%i in (
      'reg query %net% /s ^| findstr /irc:"dhcpipaddress"'
    ) do (
      if "%%i" equ "0.0.0.0" echo.Disconnected.&goto:eof
      echo.%%i
    )
  endlocal
exit /b
Добавлено через 45 минут
Нашел еще одно свое сочинение относительно VirusTotal'а - whois.cmd (да, да, и такое есть в БД у VT).
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@set @whois=0 /*
  @echo off
    set @whois=
    cscript /nologo /e:jscript "%~f0" %*
  exit /b
*/
 
(function(domain) {
  String.prototype.toJSON = function() {
    return eval('(' + this + ')');
  };
 
  var key = 'f25133d9068704c23335fc39a7351828fa80c5dde894d731d5450cf8ab8569e8',
      lnk = 'https://www.virustotal.com/vtapi/v2/domain/report', json;
 
  with (new ActiveXObject('WinHTTP.WinHTTPRequest.5.1')) {
    Open('GET', lnk + '?apikey=' + key + '&domain=' + domain);
    Send();
    json = ResponseText.toJSON();
 
    if (json['response_code'] === 0) {
      WScript.echo(json['verbose_msg'] + '.');
      WScript.Quit(1);
    }
 
    WScript.echo(json['whois']);
  }
}(
  WScript.Arguments.length !== 1
  ? WScript.Quit(1)
  : WScript.Arguments.Unnamed(0)
));
Пример:
Код
E:\sandbox> whois cyberforum.ru
domain:        CYBERFORUM.RU
nserver:       ns1.cyberguru.ru.
nserver:       ns2.cyberguru.ru.
state:         REGISTERED, DELEGATED, VERIFIED
person:        Private Person
registrar:     REGTIME-RU
admin-contact: https://whois.webnames.ru
created:       2006.10.07
paid-till:     2016.10.07
free-date:     2016.11.07
source:        TCI

E:\sandbox>
Добавлено через 22 часа 22 минуты
Командные сценарии очень удобны при дистрибуции небольших .NET программ. Например, следующий сценарий создает и запускает сборку app.exe, которая выводит список именованных каналов Windows, после чего все временные файлы, включая саму сборку, удаляются.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
@echo off
  setlocal
    for /f "skip=3 tokens=3" %%i in (
      '2^>nul reg query HKLM\SOFTWARE\Microsoft\.NETFramework /v InstallRoot'
    ) do (
      for /f %%j in (
        '2^>nul dir /a:d /b %%i ^| findstr /rc:"3.5"'
      ) do set "csc=%%i%%j\csc.exe"
    )
    if "%csc%" equ "" echo.Compiler not found.&goto:eof
 
    set t="%tmp%\source.cs"
    for /f "tokens=1 delims=:" %%i in (
      'findstr /n "exit /b" "%~f0"'
    ) do set /a "ofs=%%i+1"
    more +%ofs% "%~f0">%t%
    %csc% /nologo /t:exe /out:"%tmp%\app.exe" /optimize+ ^
    /debug:pdbonly %t%
    pushd "%tmp%"
    app.exe
    del /f /q app.* source.cs
    popd
  endlocal
exit /b
 
using System;
using System.IO;
using System.Reflection;
using System.ComponentModel;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
using System.Diagnostics.CodeAnalysis;
 
[assembly: AssemblyCompany("greg zakharov")]
[assembly: AssemblyCopyright("Copyright (C) 2015 greg zakharov")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyTitle("pipelist")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: CLSCompliant(true)]
 
namespace PipeList {
  internal sealed class AssemblyInfo {
    private  Type a;
    internal AssemblyInfo() { a = typeof(Program); }
 
    internal String Copyright {
      get {
        return ((AssemblyCopyrightAttribute)Attribute.GetCustomAttribute(
            a.Assembly, typeof(AssemblyCopyrightAttribute)
        )).Copyright;
      }
    }
 
    internal String Title {
      get {
        return ((AssemblyTitleAttribute)Attribute.GetCustomAttribute(
            a.Assembly, typeof(AssemblyTitleAttribute)
        )).Title;
      }
    }
 
    internal String Version {
      get { return a.Assembly.GetName().Version.ToString(2); }
    }
  } //AssemblyInfo
 
  [StructLayout(LayoutKind.Explicit, Size = 8)]
  internal struct LARGE_INTEGER {
    [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
    [FieldOffset(0)]
    internal Int64  QuadPart;
    [FieldOffset(0)]
    internal Int32  LowPart;
    [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
    [FieldOffset(4)]
    internal UInt32 HighPart;
  } //LARGE_INTEGER
 
  [StructLayout(LayoutKind.Sequential)]
  internal struct IO_STATUS_BLOCK {
    internal UInt32 Status;
    internal UInt64 Information;
  } //IO_STATUS_BLOCK
 
  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  internal struct FILE_DIRECTORY_INFORMATION {
    internal UInt32        NextEntryOffset;
    internal UInt32        FileIndex;
    internal LARGE_INTEGER CreationTime;
    internal LARGE_INTEGER LastAccessTime;
    internal LARGE_INTEGER LastWriteTime;
    internal LARGE_INTEGER ChangeTime;
    internal LARGE_INTEGER EndOfFile;
    internal LARGE_INTEGER AllocationSize;
    internal UInt32        FileAttributes;
    internal UInt32        FileNameLength;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    internal Byte[]        FileName;
  } //FILE_DIRECTORY_INFORMATION
 
  internal static class NativeMethods {
    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    internal static extern SafeFileHandle CreateFile(
        String    lpFileName,
        UInt32    dwDesiredAccess,
        FileShare dwShareMode,
        IntPtr    lpSecurityAttributes,
        FileMode  dwCreationDisposition,
        UInt32    dwFlagsAndAttributes,
        IntPtr    hTemplateFile
    );
 
    [DllImport("ntdll.dll")]
    internal static extern Int32 NtQueryDirectoryFile(
        SafeFileHandle      FileHandle,
        IntPtr              Event,
        IntPtr              ApcRoutine,
        IntPtr              ApcContext,
        out IO_STATUS_BLOCK IoStatusBlock,
        [Out] IntPtr        FileInformation,
        UInt32              Length,
        UInt32              FileInformationClass,
        [MarshalAs(UnmanagedType.Bool)]
        Boolean             ReturnSingleEntry,
        IntPtr              FileName,
        [MarshalAs(UnmanagedType.Bool)]
        Boolean             RestartScan
    );
  } //NativeMethods
 
  internal sealed class Program {
    const UInt32 FileDirectoryInformation = 1;
    const UInt32 GENERIC_READ             = 0x80000000;
    const Int32  STATUC_SUCCESS           = 0x00000000;
 
    static T PtrToStrc<T>(IntPtr p) {
      return (T)Marshal.PtrToStructure(p, typeof(T));
    }
 
    static void GetLastError() {
      Console.WriteLine(new Win32Exception(Marshal.GetLastWin32Error()).Message);
    }
 
    static void Main() {
      AssemblyInfo ai = new AssemblyInfo();
      SafeFileHandle pipes;
      IntPtr ptr, ofs;
      IO_STATUS_BLOCK isb;
      Int32 ntstatus;
      Boolean query = true;
 
      pipes = NativeMethods.CreateFile(
        @"\\.\pipe\", GENERIC_READ, FileShare.ReadWrite | FileShare.Delete,
        IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero
      );
 
      if (pipes.IsInvalid) {
        GetLastError();
        return;
      }
 
      Console.WriteLine("{0} v{1}\n{2}\n", ai.Title, ai.Version, ai.Copyright);
      Console.WriteLine("{0,-40}{1,14}{2,20}", "Pipe Name", "Instances", "Max Instances");
      Console.WriteLine("{0,-40}{1,14}{2,20}", "---------", "---------", "-------------");
 
      ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(FILE_DIRECTORY_INFORMATION)));
      try {
        ofs = ptr;
        while (true) {
          ntstatus = NativeMethods.NtQueryDirectoryFile(
            pipes, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, out isb, ofs, 1024,
            FileDirectoryInformation, false, IntPtr.Zero, query
          );
 
          if (ntstatus != STATUC_SUCCESS) break;
 
          while (true) {
            FILE_DIRECTORY_INFORMATION fdi = PtrToStrc<FILE_DIRECTORY_INFORMATION>(ofs);
            IntPtr name = (IntPtr)(
              Marshal.OffsetOf(typeof(FILE_DIRECTORY_INFORMATION), "FileName").ToInt64() + ofs.ToInt64()
            );
            Console.WriteLine("{0,-40}{1,14}{2,20}",
              Marshal.PtrToStringUni(name, (Int32)(fdi.FileNameLength / 2)),
              fdi.EndOfFile.LowPart,
              fdi.AllocationSize.LowPart
            );
 
            if (fdi.NextEntryOffset == 0) break;
            ofs = (IntPtr)(ofs.ToInt64() + fdi.NextEntryOffset);
          } //while
          query = false;
        } //while
      }
      catch (Exception e) {
        Console.WriteLine(e.Message);
      }
      finally {
        Marshal.FreeHGlobal(ptr);
      }
    }
  } //Program
}
2
greg zakharov
Покинул форум
2401 / 991 / 281
Регистрация: 07.05.2015
Сообщений: 1,991
27.09.2015, 13:40 100
Смена регистра строки представленной в виде набора латинских символов.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@echo off
  setlocal enabledelayedexpansion
    rem вызов функции
  endlocal
exit /b
 
:changeCase
  for /l %%i in (65, 1, 90) do (
    cmd /c exit /b %%i
    set "u=!=exitcodeascii!"
    set /a "i=%%i+32"
    cmd /c exit /b !i!
    if "%1" equ "L" (
      set "map=!map! ^"!u!=!=exitcodeascii!^""
    )
    if "%1" equ "U" (
      set "map=!map! ^"!=exitcodeascii!=!u!^""
    )
  )
  set "map=!map:~1,155!"
  set "str=%*"
  call:invoke str
  for /f "tokens=2 delims==" %%i in ('set str') do set "str=%%i"
  if "%1" equ "L" echo !str:L =!
  if "%1" equ "U" echo !str:U =!
  exit /b
  :invoke
  for %%i in (!map!) do call set "%1=%%%1:%%~i%%"
На месте комментария пишем:
Код
call:changeCase U this is test string
После запуска получим:
Код
THIS IS TEST STRING
Или:
Код
call:changeCase L THIS IS TEST STRING
Вернет:
Код
this is test string
Это всего лишь пример, так как набрасывал все это, что называется, на скорую руку, поэтому без дополнительных клинических тестов не рекомендуется к употреблению.
0
27.09.2015, 13:40
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2015, 13:40

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

рисунок в BAT\CMD
Если кому будет не сложно можете нарисовать знак сбербанка и слово рядом) Буду очень благадарен

Меню в BAT/CMD
Вопрос от полного ламера. У меня такая проблемма надо сделать меню в CMD чтобы при нажатии 1...

Задание CMD/BAT
1. Изменить вид приглашения, поместив туда время без секунд и миллисекунд. 2. Создать в текущем...

На каком языке программирования пишутся скрипты для bat и vbc?
День добрый. Подскажите на каком языке пишутся скрипты для bat и vbc. Я знаю что под линукс идет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.