Форум программистов, компьютерный форум, киберфорум
Наши страницы

Batch (CMD/BAT)

Войти
Регистрация
Восстановить пароль
 
 
Dragokas
Эксперт WindowsАвтор FAQ
16118 / 6937 / 834
Регистрация: 25.12.2011
Сообщений: 10,722
Записей в блоге: 16
#1

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

15.10.2012, 00:56. Просмотров 287857. Ответов 152

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

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

Правила темы:
  • При выкладывании скрипта постарайтесь тщательно описывать принцип его работы и по-больше комментировать строки Вашего кода.
  • Код, состоящий из > 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
Прогресс-бар копирования файлов ссылка
Циклическое копирование файлов по каталогам с ожиданием завершения их дозаписи в исходную папку. ссылка
Создание нуль-копии папки для выкладывания на форуме ссылка
Получение серийного номера всех съемных устройств и физических жестких дисков (не разделов). Получение имен разделов физических накопителей (кроме оптических). ссылка

Другое
Расчёт индекса массы тела и идеального веса ссылка
19
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2012, 00:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Полезные BAT/CMD скрипты (CMD/BAT):

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

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

несколько заданий на CMD/BAT - CMD/BAT
очень прошу, помогите с этими задачками :(... 1.Напишите командный .bat-файл, который при запуске добавляет в файл delta.txt...

сортировка по времени в bat/cmd - CMD/BAT
сабж в папке А лежит bat, который в папке Б сортирует все файлы по времени и оставляет только 10 самых свежих спасибо заранее

Числовые операторы в CMD/BAT - CMD/BAT
Чего они делают объясните? взято из set /? Добавлено через 1 час Унарные операторы: set /a y=&quot;!&quot;%x% дает результат(%y%) 1...

zenity.exe в bat\cmd - CMD/BAT
Приветствую всех! Гуру помогите разобраться, решил вот использовать утилиту zenity.ехе для вывода предупреждающего текста. То есть идея...

152
greg zakharov
Покинул форум
1825 / 740 / 187
Регистрация: 07.05.2015
Сообщений: 1,478
Записей в блоге: 39
19.04.2016, 18:27 #121
sleep.cmd
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
  setlocal enabledelayedexpansion
    set "i=0" % rem : может быть указан только один параметр
    for %%i in (%*) do set /a "i+=1"
    if %i% neq 1 goto:man
    
    (echo:%~1|>nul findstr /xrc:"[0-9]*")&&(
      set /a "s=%~1/2+1"
      w32tm /stripchart /computer:localhost /period:1^
       /dataonly /samples:!s!>nul
    )||(
      :man
      echo:Usage: %~n0 ^<seconds^>
    )
  endlocal
exit /b
3
greg zakharov
Покинул форум
1825 / 740 / 187
Регистрация: 07.05.2015
Сообщений: 1,478
Записей в блоге: 39
21.04.2016, 12:33 #122
id.cmd
Пример получения PID'а консоли, из которой запущен командный сценарий. Суть идеи (помимо отказа от WMI): скопировать typeperf во временную папку, назначить копии случайное имя, относительно которого получить PPID и устанавливить его в качестве переменной окружения консоли (чтобы при повторном вызове тратилось меньше времени).
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
@echo off
  setlocal enabledelayedexpansion
    chcp 1251>nul
    (set|>nul findstr /birc:"pid=")&&(echo:%pid%)||(
      for %%i in (typeperf.exe) do (
        if exist "%%~$PATH:i" set "src=%%~$PATH:i"
      )
      if "!src!" equ "" goto:err
      call:getrandomname 7
      2>nul pushd %tmp%
        if %errorlevel% neq 0 goto:err
        set "txt=!name!.txt"
        set "exe=!name!.exe"
        copy "!src!" !exe!>nul
        if not exist !exe! goto:err
        !exe! "\Процесс(!name!)\Код (ID) создавшего процесса"^
          -sc 1 | findstr /rc:":">!txt!
        for /f delims^=^"^,^ tokens^=2 %%i in (
          !txt!
        ) do 2>nul set /a "pid=%%i"
        del /f /q "!name!.*"
      popd
      echo:!pid!
    )
    :cleanup
  endlocal&(set "PID=%pid%"&chcp 866>nul)
exit /b
 
:err
  echo:An error has been occured.
goto:cleanup
 
:getrandomname
  set "map=abcdefghijklmnopqrstuvwxyz0123456789"
  set "i=1" % rem : длина случайного имени
  :repeat
    set /a "r=!random!%%36"
    set "name=!name!!map:~%r%,1!" % rem : случайное имя
    if !i! neq %~1 set /a "i+=1"&goto:repeat
exit /b
2
greg zakharov
Покинул форум
1825 / 740 / 187
Регистрация: 07.05.2015
Сообщений: 1,478
Записей в блоге: 39
22.04.2016, 21:18 #123
videocard.cmd
Пример получения данных о видеокарте в обход WMI. Последняя строка сценария должна быть пустой (данные о карте какбэ кэшируются, чтобы при повторном запуске не тратилось много времени).
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
@echo off
  setlocal
    rem последняя строка должна быть пустой
    :begin
      if exist "%~dp0$.txt" del /f /q $.txt
      for /f "delims=:" %%i in (
        'findstr /nrc:"^###$" "%~f0"'
      ) do set /a "i=%%i"
      if "%i%" equ "" goto:dump
      more +%i% "%~f0"&goto:end
    :dump
      for %%i in (dxdiag.exe) do (
        if not exist "%%~$PATH:i" (
          echo:Could not locate dxdiag tool.
          goto:end
        )
      )
      echo:###>>"%~f0"
      <nul set /p "msg=Standby..."
      dxdiag /t $
      for /f "delims=:" %%i in (
        'findstr /nirc:"^display" $.txt'
      ) do set /a "i=%%i+1"
      for /f "delims=" %%i in (
        'more +%i% $.txt'
      ) do (
        (echo:"%%~i"|>nul findstr /brc:"^""\-.*")^
        &&goto:begin||(echo:%%i>>"%~f0")
      )
    :end
  endlocal
exit /b
2
greg zakharov
Покинул форум
1825 / 740 / 187
Регистрация: 07.05.2015
Сообщений: 1,478
Записей в блоге: 39
12.05.2016, 14:30 #124
uptime.cmd - исправленная версия, не требует chcp и явного указания typeperf'у счетчика производительности, так как подстановка производится отностельно индекса того или иного счетчика (в данном случае "\Система\Время работы системы"), что по сути делает сценарий локаленезависимым.
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
@echo off
  setlocal enabledelayedexpansion
    for %%i in (lodctr.exe) do (
      if not exist "%%~$PATH:i" (
        echo:Could not retrieve system up time.
        goto:eof
      )
    )
    set "pc=%tmp%\perf.tmp" % rem : performance counters list
    lodctr /s:%pc%
    call:findlocalestr 2   object
    call:findlocalestr 674 counter
    for /f delims^=^"^ tokens^=3 %%i in (
      'typeperf "%object%%counter%" -sc 1 ^| findstr /rc:":"'
    ) do 2>nul set /a "s=%%i" % rem : total seconds
    set /a "ss=s%%60", "s/=60", "mm=s%%60", "s/=60", "hh=s%%24", "dd=s/24"
    for %%i in (%hh% %mm% %ss%) do (
      if %%i lss 10 (set "t=!t!0%%i:") else (set "t=!t!%%i:")
    )
    echo:%dd%.%t:~,-1%
    del /f /q "%pc%"
  endlocal
exit /b
 
:findlocalestr
for /f "tokens=2 delims==" %%i in (
  'find "%~1=" "%pc%" ^| findstr /brc:"%~1="'
) do set "%2=\%%i"
exit /b
Из минусов - создается временный файл. Так как сценарий я запилил у себя на хабе, может со временем будет исправлено и это.
1
YuS_2
Любознательный
565 / 432 / 141
Регистрация: 10.03.2016
Сообщений: 967
03.06.2016, 06:06 #125
Интерактивный сценарий для упаковки файлов динамических виртуальных жестких дисков (формат "vdi", но возможно добавление других), использующихся в Oracle VM VirtualBox. Есть возможность выбора из подключенных виртуальных дисков, либо непосредственно указываем абсолютный путь к не подключенным файлам (абсолютные пути к подключенным файлам тоже работают). Используется консольный менеджер виртуальной машины, путь к которому необходимо либо прописать в системную переменную PATH, либо указать прямо в сценарии.

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
@echo off
rem v2.1
 
rem путь к файлу конфигурации VirtualBox
set "Vbox=%userprofile%\.VirtualBox\VirtualBox.xml"
 
rem путь к файлу vboxmanage.exe должен быть прописан в системной переменной Path,
rem либо для корректного запуска необходимо указать абсолютный путь:
set "vbman=vboxmanage.exe"
 
rem -----
rem Инициализация переменных, для поддерживаемых расширений. Число расширений
rem можно увеличить добавлением переменных extN, по аналогии с существующими.
rem Кроме того, необходимо указать их количество в переменной n
set "ext1=*.vdi"
set "ext2=*.vhd"
set "ext3="
set n=2
rem -----
 
for /l %%g in (1,1,%n%) do (
    if defined ext%%g (call :dper %%g)
)
for /l %%h in (1,1,%n%) do (
    if defined ext%%h (call :fper %%h)
)
goto pp
:dper
set vn=%1
call set "dext=%%dext%% "%%ext%vn%%%""
exit /b
:fper
set nv=%1
call set "fext=%%fext%% /c:"%%ext%nv%:~1%%""
exit /b
:pp
echo Сценарий упаковки файла динамического виртуального диска Oracle VirtualBox.
echo Перед упаковкой, необходимо в загруженной гостевой ОС выполнить максимальную
echo дефрагментацию, затем заполнить нулями свободное пространство ^(для этого
echo хорошо подходит программа sDelete ^(sysinternals.com^)^).
echo Примечание: Имя упаковываемого, неподключенного файла виртуального диска НЕ
echo должно совпадать с любым подключенным файлом, либо абсолютный путь в сценарии
echo должен быть указан только от реально подключенного виртуального диска.
echo.
choice /c yn /m "Продолжаем "
if "%errorlevel%"=="1" goto begin
echo.
echo Выходим
echo.
pause&&exit
:begin
choice /n /c 12 /m "Выберите 1 - для работы с подключенными дисками, 2 - для указания абсолютного пути: "
goto disk%errorlevel%
:disk1
set "vm=%Vbox%"
goto run
:disk2
set "vm="
:run
cls
echo Выполните следующие действия:
echo.
pushd "%~dp0"
if not exist "%vm%" goto out
echo Список имен подключенных машин:
set cnt=0 
for /f tokens^=2^ delims^=^" %%i in ('^<"%vm%" find "MachineEntry"') do call :list "%%~i"
echo.
goto out
:list
if "%~1"=="" (echo Нет подключенных машин&&goto out)
set /a cnt+=1
set "vbu%cnt%=%~1"
call set "tmp=%%vbu%cnt%%%"
for /f "tokens=2 delims=: " %%j in ('%vbman% showvminfo %tmp%') do echo %cnt%. %%j&&goto ex
:ex 
exit /b
:vbox
set ct=0
set "v=%~1"
%vbman% showvminfo %v% |findstr /i %fext% >nul
if errorlevel 1 (echo Диски не найдены&&exit /b 1)
for /f "tokens=3,4 delims=)(" %%a in ('%vbman% showvminfo %v% ^|findstr /i %fext%') do (
    call :hd "%%~a" "%%~b"
)
exit /b
:hd
set "$1=%~1"
set "$2=%~2"
set /a ct+=1
set hd%ct%=%$2:~6%
echo %ct% %~nx1
exit /b
:out
if exist "%vm%" (
    echo Выберите номер подключенной VM
    set /p x="(q=выход): "
) else (
    echo Укажите абсолютный путь к каталогу с виртуальным диском 
    set /p x="(q=выход): "
    goto q2
)
:q1
if "%x%"=="" goto begin
if "%x%"=="q" (goto chce)
if defined vbu%x% (
    echo.
    echo Список дисков в выбранной виртуальной машине:
    echo.
    call :vbox "%%vbu%x%%%" ||goto chce
) else (
    goto begin
)
goto file
:q2
if "%x%"=="" goto begin
if "%x%"=="q" (goto chce)
set kon=0
for /l %%k in (1,1,%n%) do (
    if defined ext%%k call :tm %%k
)
goto tt
:tm
set dn=%1
call set prn=%%ext%dn%%%
if exist "%x%\%prn%" set /a kon+=1
exit /b
:tt
if %kon%==0 (echo.&&echo В этом каталоге нет файлов виртуальных дисков&&echo.&&goto chce)
:cont
cd /d "%x%"
echo.
echo Список файлов виртуального диска:
echo.
set cnt=0
for /f "delims=" %%a in ('dir /a-d/b %dext%') do (
    call :per "%%~a"
)
goto file
:per
set /a cnt+=1
set var%cnt%=%~1
call echo %cnt%. %%var%cnt%%%
exit /b
:file
echo.
set /p y="Введите номер виртуального диска: "
if defined hd%y% (call set "dsk=%%hd%y%%%"&&goto pusk)
call set "dsk=%%var%y%%%"
if not defined dsk (echo.&&echo Нет такого диска&&goto chce) else (goto pusk)
pause&&exit
:chce
choice /c yn /m "Выходим "
goto answ%errorlevel%
echo Ошибка. Выходим
pause&&exit
:answ1
echo Выход
timeout /t 3
exit
:answ2
goto begin
:pusk
echo.
echo Запускаем упаковку:
echo.
%vbman% modifyhd "%dsk%" --compact
if errorlevel 1 (
    echo.
    echo. в•”в•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•—
    echo. в•‘ Ошибка!!! Имя файла виртуального диска совпадает с именем в•‘
    echo. в•‘ подключенного файла, при отличающихся абсолютных путях    в•‘
    echo. в•љв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ђв•ќ
    echo.
)
echo.
goto chce
:answ255
:disk255
echo Ошибка&&pause&&exit
0
Вложения
Тип файла: rar compact_vd_v2.rar (2.0 Кб, 10 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
16118 / 6937 / 834
Регистрация: 25.12.2011
Сообщений: 10,722
Записей в блоге: 16
07.06.2016, 19:53  [ТС] #126
Проигрывание звука

Придумал такой вариант проигрывания звукового файла через mshta:

Вариант с доработкой от ComSpec:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
SetLocal EnableExtensions
 
set "mp3=c:\windows\media\tada.wav"
 
:: кол-во секунд воспроизведения
set delay=2
 
call :PlaySnd "%mp3%" %delay%
 
pause
goto :eof
 
:PlaySnd [Path] [Delay]
  set "SndPath=%~1" & set /a "delay2=%2+1"
  set "pause=new ActiveXObject('WScript.Shell').Run('ping -n $ localhost', 0, true)"
  set "script=<script>document.all.sound.src = '%SndPath:\=\\%'</script>"
  set "script2=<script>%%pause:$=%delay2%%%; close()</script>"
  call start /min /wait mshta "about:<bgsound id=sound>%script%%script2%"
exit /B
Старый вариант с убийством процесса:
Кликните здесь для просмотра всего текста

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 EnableExtensions
 
set "mp3=c:\windows\media\tada.wav"
 
:: кол-во секунд воспроизведения
set delay=2
 
call :PlaySnd "%mp3%" %delay%
 
pause
goto :eof
 
 
:PlaySnd [Path] [Delay]
  set "SndPath=%~1"
  set "SndPath=%SndPath:\=\\%"
  start /min mshta "about:<bgsound id=sound><script>document.all.sound.src = '%SndPath%'</script>"
  set /a delay2=%~2+1
  Timeout /? >NUL 2>&1 & if errorlevel 9009 (>NUL ping -n %delay2% 127.1) else (>NUL Timeout /T %~2 /Nobreak)
 
  for /f "tokens=2 delims=," %%a in ('tasklist /fo csv /nh /fi "IMAGENAME eq cmd.exe" 2^>NUL') do (
    for /f "UseBackQ skip=2 tokens=2 delims=," %%b in (`wmic process where "ParentProcessId=%%~a and caption='mshta.exe'" get ProcessId /format:csv 2^>NUL`) do (
      for /f "delims=" %%c in ("%%b") do taskkill /f /pid %%c >NUL
  ))
exit /B
1
greg zakharov
Покинул форум
1825 / 740 / 187
Регистрация: 07.05.2015
Сообщений: 1,478
Записей в блоге: 39
05.10.2016, 22:21 #127
"Открывашка" шелл-папок
Бывают ситуации, когда нужно в проводнике "запрыгнуть" в некую папку, скажем, AppData. Из самого проводника делать это неудобно, жать Tab в консоли также надоедает, в результате чего накидал командный сценарий, позволяющий "гулять" по такого рода папкам.
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
@echo off
  setlocal enabledelayedexpansion
    set "hklm=HKLM"
    set "hkcu=HKCU"
    set "key=\Software\Microsoft\Windows\CurrentVersion"
    set "key=%key%\Explorer\Shell Folders"
    
    set "i=0"
    call:getnames %hklm% %i%
    call:getnames %hkcu% %i%
    
    set "i=0"
    for %%i in (%*) do set /a "i+=1"
    if !i! neq 1 goto:man
    
    set "i=0"
    for /f "tokens=1,* delims==" %%i in (
      'set arr ^| findstr /irc:"=%~1"'
    ) do (
      set "map=!map!%%~j..."
      set /a "i+=1"
    )
    set "map=!map:~,-3!"
    if /i "!map!" equ "~,-3" goto:man
    if !i! neq 1 echo !map!&goto:eof
    rundll32 shell32.dll,ShellExec_RunDLL "shell:!map:.=!"
  endlocal
exit /b
 
:getnames
  set "i=%2"
  for /f "tokens=1,2" %%i in (
    'reg query "%1!key!" ^| findstr /irc:"reg_sz"'
  ) do (
    if /i "%%j" equ "reg_sz" (
      set "arr.!i!=%%i"
    ) else (
      set "arr.!i!=%%i %%j"
    )
    set /a "i+=1"
  )
exit /b
 
:man
  set "map=" % rem : flush wrong pattern
  for %%i in (
    "Usage: %~n0 [path name]"
    ""
    "Example 1:"
    "   C:\> %~n0 d"
    "This command opens Desktop folder."
    ""
    "Example 2:"
    "   C:\> %~n0 ``common p''"
    "Jumps to Common Programs folder."
    ""
    "The next paths are available on this system:"
  ) do echo:%%~i
  for /f "tokens=1,* delims==" %%i in ('set arr') do (
    set "map=!map!%%j..."
  )
  echo !map:~,-3!
exit /b
Как оно работает, написано в сопроводительном мане, но на всякий случай поясню кое-какие моменты (у меня сценарий назван j.cmd).
Код
E:\sandbox> j d
Пример выше открывает Desktop, в названиях папок где встречаются пробелы нужны кавычки:
Код
E:\sandbox> j "start m"
В этом примере будет открыто папка стартового меню пользователя.
Если соответсвий несколько, будут выведены возможные варианты, например:
Код
E:\sandbox> j s
Если соответсвий нет вовсе, выводится ман.
2
greg zakharov
Покинул форум
1825 / 740 / 187
Регистрация: 07.05.2015
Сообщений: 1,478
Записей в блоге: 39
14.10.2016, 23:00 #128
Вычисление md2, md4, md5, sha1, sha256, sha384 и sha512 хэшей файла
Подход не совсем уникальный, так как certutil "из коробки" появился начиная с Win2k3, правда тогда то было какое-то недоразумение, если учесть частые лаги. В общем, код ниже писался на Win7, но может кому и сгодится в хозяйстве (по умолчанию вычисляется sha256).
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
@echo off
  for %%i in (certutil.exe) do (
    if not exist "%%~$PATH:i" goto:err
  )
  setlocal enabledelayedexpansion
    set "i=0"
    for %%i in (%*) do set /a "i+=1"
    if !i! equ 1 (
      call:sum "%~1"
      goto:eof
    )
    if !i! equ 2 (
      call:sum "%~1" "%~2"
      goto:eof
    )
    goto:man
  endlocal
exit /b
 
:err
  echo:Certutil has not been found.
exit /b
 
:man
  for %%i in (
    "Usage: %~n0 file [algorithm]"
    ""
    "Default algorithm is sha256."
    "Supported algorithms are md2, md4, md5,"
    "sha1, sha256, sha384 and sha512."
    ""
    "Note: this one was written and tested"
    "on Windows 7."
  ) do echo:%%~i
exit /b
 
:sum
  if not exist "%~1" goto:man
  if "%~2" equ "" (
    set "alg=SHA256"
  ) else (
    for /f "tokens=2 delims=:" %%i in (
      '2^>^&1 find "" %~2'
    ) do set "alg=%%i"
  )
  set "alg=!alg: =!"
  for /f "skip=1 delims=" %%i in (
    'certutil -hashfile "%~1" !alg!^
    ^| findstr /virc:"certutil"'
  ) do set "hash=%%i"
  if /i "!hash!" equ "" (
    echo:=^>err
  ) else (echo !hash: =!)
exit /b
Примеры использования:
Код
E:\sandbox> hasher app.exe
91b8d19a897cac6cfc638b0c195ee541e78781402e1d59dad7f3d532376f32d2

E:\sandbox> hasher app.exe md5
fef8118edf7918d3c795d6ef03800519
3
greg zakharov
Покинул форум
1825 / 740 / 187
Регистрация: 07.05.2015
Сообщений: 1,478
Записей в блоге: 39
16.10.2016, 17:56 #129
Монтирование Яндекс.Диска
В одной из тем был вопрос касательно монтирования Яндекс.Диска посредством WebDAV через комстроку, что возможно сделать лишь на винде > 2k3, то бишь начиная с Vista, - утверждать не стану, так как не проверялось, а вот на Win7 работает точно. Единственно, не свистоперделок ради, а для некоторой безопасности (хотя что есть безопасность?!), не хотелось бы сверкать паролем и именем пользователя от диска. Порывшись в своих старых записях, нашел заметку, как скрыть пароль от посторонних глаз.
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
@echo off
  for /f "tokens=2 delims=][." %%i in ('ver') do (
    for /f "tokens=2" %%j in ("%%i") do (
      if %%j lss 6 (
        echo:This requires Vista or above.
        goto:eof
      )
    )
  )
  setlocal enabledelayedexpansion
    set "i=0"
    for %%i in (%*) do set /a "i+=1"
    if !i! neq 1 goto:man
    
    set "arg=%~1"
    if "!arg:~0,1!" neq "-" if "!arg:~0,1!" neq "/" goto:man
    if /i "!arg:~1!" equ "mount" (
      call:secureinput "User"
      echo.
      call:secureinput "Pass"
      echo.
      net use * https://webdav.yandex.ru !pass!^
      /user:!user!@yandex.ru /persistent:yes
      goto:eof
    )
    if /i "!arg:~1!" equ "unmount" (
      for /f "tokens=1" %%i in (
        'net use ^| findstr /irc:"yandex"'
      ) do net use %%i /delete
      goto:eof
    )
    goto:man
  endlocal
exit /b
 
:man
  for %%i in (
    "Usage: %~n0 [action]"
    "Where <action> is one of the next:"
    "   mount or unmount"
    ""
    "Example 1:"
    "   C:\bin> %~n0 -mount"
    ""
    "Note that while entering a user name and"
    "password both values are not displayed on"
    "the screen."
    ""
    "Example 2:"
    "   C:\bin> %~n0 -unmount"
  ) do echo:%%~i
exit /b
 
:secureinput
  <nul set /p "%~1=%~1: "
  for /f %%i in (
    '"prompt;$H&for %%i in (1) do rem"'
  ) do set "$=%%i"
  :repeat
    set "c="
    for /f "delims=" %%i in (
      '2^>nul xcopy /l /w "%~f0" "%~f0"'
    ) do if not defined c set "c=%%i"
    set "c=%c:~-1%"
    if not defined c goto:end
    if !$! equ !c! (
      <nul set /p "=!$! !$!"
      set "c="
      if defined %~1 set "%~1=!%~1:~0,-1!"
    ) else <nul set /p "="
    if not defined %~1 (
      set "%~1=!c!"
    ) else for /f delims^=^ eol^= %%i in ("!%~1!") do (
      set "%~1=%%i!c!"
    )
    goto:repeat
  :end
exit /b
Примеры:
Код
C:\bin> yadisk /mount
User:
Pass:
Диск Z: сейчас подключен к https://webdav.yandex.ru.

Команда выполнена успешно.

C:\bin> yadisk -unmount
Как уже было сказано при вводе имени и пароля символы не отображаются.
6
alpap
1177 / 950 / 290
Регистрация: 26.04.2015
Сообщений: 3,515
14.11.2016, 18:22 #130
Сделал утилиту, которая позволяет выводить из файла содержимое, расположенное между тегами.
Теги, в определенных пределах, могут быть довольно разнообразные, ниже пример.
Запуск: teg_s.bat файл откуда файл куда тег блок
Пример: teg_s.bat file.txt new.txt --- 2 (здесь берем все между 2-м и 3-м тегом вида, примерно -----)
Если параметр "блок" не указывать, будет взято содержимое между последним и предпоследним тегами или между первым и вторым, если блок единственный.
Тег или часть его, указывать максимально похожий на тот, что есть в файле, чтобы точнее его определить.

Код:

Windows Batch file
1
2
3
4
5
6
7
8
@echo off
if "%*"=="" (echo parameters are absent!& echo:[re-executing]& pause) else (set "f_in=%~1"& set "f_out=%~2"& set "teg=%~3"& set "sn=%~4")
setlocal enabledelayedexpansion
<"%f_in%" (for /f "delims=[]" %%a in ('find /n /v ""^|findstr/lc:"%teg%"') do @set/a n+=1, n_=n-1, sn_=sn+1& set "N!n!=%%a")
if "%sn%"=="" (set/a nd=N%n_%+1, kd=N%n%-1) else (set/a nd=N%sn%+1, kd=N%sn_%-1)
setlocal disabledelayedexpansion
<"%f_in%">"%f_out%" (for /f "delims=" %%a in ('"for /l %%a in (%nd%,1,%kd%) do @find /n /v ""|find "[%%a]""') do @set "s=%%a"& cmd/v/c echo[!s:*]^^=!)
exit
Пример:

Содержимое файла "file.txt":
Код
stroka aaa
ddd
aastroka
eee
strokaaa
fff
bbbaa
Содержимое "new.txt" по команде:
Код
teg_s.bat file.txt new.txt aa
fff

Содержимое "new.txt" по команде:
Код
teg_s.bat file.txt new.txt stroka 2
eee
1
volodin661
1022 / 798 / 124
Регистрация: 10.12.2013
Сообщений: 2,763
26.11.2016, 04:45 #131
Извлечение IP-адресов с помощью WMIC

Для вытаскивания информации из информационных систем в IT-отрасли нашего земного шара существуют стандартизированные механизмы.
Microsoft обязана им следовать и её реализация называется WMI ( Windows Management Instrumentation ).
Интерфейсом к WIM является утилита командной строки WMIC.

Например, извлечь IP-адрес(а), привязанный(ые) к сетевому адаптеру:
Windows Batch file
1
WMIC nicconfig WHERE "Caption like '%ethernet%'" GET IPAddress /FORMAT:value
Вывод:
Код
IPAddress={"10.10.10.10","172.17.17.17"}
Можно добавить в вывод интересные нам поля:
Windows Batch file
1
WMIC nicconfig WHERE "Caption like '%ethernet%'" GET Caption, IPAddress, IPSubnet /FORMAT:value
Вывод:
Код
Caption=[00000001] AMD PCNET Family PCI Ethernet Adapter
IPAddress={"192.168.88.118"}
IPSubnet={"255.255.255.0"}
Посмотреть другой адаптер:
Windows Batch file
1
wmic nicconfig where "Caption like '%PPP%'" get Caption, IPAddress, IPSubnet /format:value
Вывод:
Код
Caption=[00000006] WAN Miniport (PPPOE)
IPAddress=
IPSubnet=
Добавлено через 3 часа 19 минут
Хочу внести стратегическое дополнение.

Как я уже написал в самом начале,
WMI - это реализация DMTF-стандарта под названием CIM
( Common Information Model ); Майкрософт, будучи членом DMTF,
безусловно придерживался и будет придерживаться в дальнейшем этого стандарта.
В старой реализации WMI, которая относится ещё к Windows NT 4.0, на клиенте и на сервере были запущены сервисы,
которые использовали механизмы DCOM/RPC, для отправления запросов/получения данных.
WMIC использует именно эту старую реализацию.

В 2012-ом году, произошли изменения стандарта CIM, Microsoft отреагировал на это,
выпустив Windows Management Framework-3 и даже поменял аббревиатуру с WMI на MI ( Managment Infrastructure ),
что, впрочем, не мешает ему по-прежнему пользоваться термином WMI.
Главное отличие - это появление клиент-серверного протокола Web Services for Management или WS-MAN, который в Microsoft живёт под именем WinRM-сервис и который заменяет DCOM/RPC.
Новые cmdlet-ы powershell разговаривают на языке именно этого протокола,
то есть, внутреннее API полностью поменялось; в технические подробности не вдаюсь.

Теперь можно опрашивать и извлекать IP-адрес не только Windows-машин, но и Linux, а также маршрутизаторов, коммутаторов, пылесосов и кофемолок, лишь бы в последних был реализован сервис MI ( точнее, OMI - Open Management Infrastructure )

Итак, извлечь IP-адрес пылесоса наш WMIC не способен [ ],
поэтому современная стратегия использования WMI состоит в переходе на powershell.

refs:
https://donjones.com/2015/04/14/omi-cim-wmi/
https://powershell.org/2015/04/24/ma...tf-dictionary/
https://collaboration.opengroup.org/omi/
https://msdn.microsoft.com/en-us/pow...witch_overview
2
FraidZZ
NetUP | Developer
3905 / 1531 / 230
Регистрация: 06.01.2013
Сообщений: 4,054
Завершенные тесты: 1
02.12.2016, 02:09 #132
По мотивам Запуск скрипта с повышенными привилегиями [руководство]

sudo.bat
Запуск команды с повышенными привилегиями с передачей всех аргументов.
(Комбинированный BAT/JS)

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@set @x=0; /*
    @cscript //nologo //e:jscript "%~dpnx0" %*
    @exit /b
*/
 
var Shell = new ActiveXObject("Shell.Application");
var WShell = new ActiveXObject("WScript.Shell");
 
var otherArgs = '';
for (var i = 1; i < WScript.Arguments.Count(); ++i)
    otherArgs += WScript.Arguments(i) + ' ';
otherArgs = otherArgs.substr(0, otherArgs.length - 1);
 
Shell.ShellExecute(WScript.Arguments(0), otherArgs, '', 'runas', 1);
Пример:
Windows Batch file
1
sudo notepad "C:\file1.txt"
root.bat
Запуск консоли с повышенными привилегиями в текущей рабочей директории, либо директории, переданной первым аргументом.

(комбинированный BAT/JS)

Javascript
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
@set @x=0; /*
    @cscript //nologo //e:jscript "%~dpnx0" %*
    @exit /b
*/
 
var Shell = new ActiveXObject("Shell.Application");
var WShell = new ActiveXObject("WScript.Shell");
var FSO = new ActiveXObject("Scripting.FileSystemObject");
 
var myWorkDir = WShell.CurrentDirectory;
 
if (WScript.Arguments.Count()) {
    try {
        var myFolder = FSO.GetFolder(WScript.Arguments(0));
    } catch (e) {
        WScript.StdErr.WriteLine('Specified PATH isn\'t found');
        WScript.Quit(1);
    }
    
    myWorkDir = WScript.Arguments(0);
    if (myWorkDir[myWorkDir.length - 1] != '\\')
        myWorkDir += '\\';
}
 
Shell.ShellExecute('cmd', '/c @cd /d ' + myWorkDir + ' & cmd', '', 'runas', 1);
Пример:
Windows Batch file
1
root C:\Users\FraidZZ
Windows Batch file
1
2
cd C:\Users\FraidZZ
root
1
YuS_2
Любознательный
565 / 432 / 141
Регистрация: 10.03.2016
Сообщений: 967
02.12.2016, 12:22 #133
В дополнение к предыдущему сообщению:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
>nul 2>&1 net session&&goto run
if /i "%~1"=="yes" goto run
>"%temp%\uac.vbs" echo set objShell=CreateObject^("Shell.Application"^)
>>"%temp%\uac.vbs" echo objShell.ShellExecute "%~0", "yes", , "runas", 1
"%temp%\uac.vbs"
exit /b
 
:run
del "%temp%\uac.vbs"
cd /d "%~dp0"
title %cd%
rem Место для основной программы. Текущий каталог = каталог запуска сценария.
echo Successfull! UAC unlock. Demo - this line remove...
pause
0
Dragokas
Эксперт WindowsАвтор FAQ
16118 / 6937 / 834
Регистрация: 25.12.2011
Сообщений: 10,722
Записей в блоге: 16
15.12.2016, 22:05  [ТС] #134
Поиск альтернативных файловых потоков, которые занимают слишком много места на диске

Как известно, большинство программ оценки свободного места (вроде WinDirStat) не показывают объем, занимаемый альтернативными файловыми потоками.
Этот скрипт призван заполнить такой недостаток.

По-умолчанию сканируется только системный диск.
В отчёт попадут файли и папки, чьи ADS занимают более 1000 байт. Можете изменить этот лимит в переменной MAX_STREAM_SIZE.

Совместимость: Windows Vista и выше.

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
@echo off
SetLocal EnableExtensions
 
set "MAX_STREAM_SIZE=1000"
 
cd /d "%~dp0"
2>nul del ADS.log
echo _______________________________
echo  ADS scaner by Alex Dragokas
title ADS scaner by Alex Dragokas
echo _______________________________
echo.
echo Scanning disk %SystemDrive% ...
echo Please, wait.
echo.
 
net session >NUL 2>NUL || (
  echo Запустите утилиту от имени Администратора !!!
  echo You need to launch this app. as Admin !!!
  pause>nul & goto :eof
)
:: for pseudo progress-bar purposes
 
set Drive=%SystemDrive%
 
call :ScanFolder %Drive%
 
:: 1 level
for /f "delims=" %%a in ('dir /b /ad-l "%Drive%\*"') do (
 
  call :ScanFolder "%Drive%\%%a"
 
  rem 2 level
  for /f "delims=" %%b in ('dir /b /ad-l "%Drive%\%%a\*"') do (
 
    rem Start recursive scanning on 2 level
    call :ScanFolder "%Drive%\%%a\%%b" /s
  )
)
 
del t.log t2.log
explorer ADS.log
pause
goto :eof
 
:ScanFolder [Path] [/s for recursive]
 
echo "%~1"
dir /r /a-l /-c %~2 "%~1\*" > t.log
echo Parsing ...
< t.log > t2.log findstr /r /c:":.*:" /c:"Содержимое папки" /c:"Directory of"
 
for /f "tokens=1-2*" %%a in (t2.log) do (
 
  if "%%a %%b"=="Содержимое папки" (
    set "Folder=%%c"
  ) else (
  if "%%a %%b"=="Directory of" (
    set "Folder=%%c"
  ) else (
  if %%a GTR %MAX_STREAM_SIZE% call :Log "%%a" "%%b %%c"
  ))
)
exit /b
 
:Log
echo %~1 "%Folder%\%~2" >> ADS.log
exit /b
Батник обязательно сохранять в кодировке OEM-866.
0
Вложения
Тип файла: zip ADS_Scanner.zip (868 байт, 17 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
16118 / 6937 / 834
Регистрация: 25.12.2011
Сообщений: 10,722
Записей в блоге: 16
21.12.2016, 23:08  [ТС] #135
Узнаём, сколько места занимают служебные файлы NTFS, невидимые в проводнике / и других файловых менеджерах.

Скрипт позволяет узнать объем файлов:
  • $Mft
  • $LogFile
  • $Volume
  • $AttrDef
  • $Bitmap
  • $Boot
  • $BadClus
  • $Secure
  • $UpCase
  • $Extend
Используется программа SysInternals Contig.

Использование:
распаковать, запустить батник Get_NTFS_Space.cmd от имени Администратора, получить отчет в файле $NTFS.log

Отчёт получается в такой форме:
Кликните здесь для просмотра всего текста

Processing C:\$Mft:
File size: 507248640 bytes
Processing C:\$Mft::$BITMAP:
File size: 61920 bytes
Processing C:\$Volume:
File size: 1859720839167 bytes
Processing C:\$AttrDef:
File size: 2560 bytes
Processing C:\$Secure::$ATTRIBUTE_LIST:
File size: 384 bytes
Processing C:\$Secure:$SDS:$DATA:
File size: 3604844 bytes
Processing C:\$Secure:$SDH:$INDEX_ALLOCATION:
File size: 393216 bytes
Processing C:\$Secure:$SII:$INDEX_ALLOCATION:
File size: 524288 bytes
Processing C:\$UpCase:
File size: 131072 bytes
Processing C:\$Extend:
File size: 0 bytes
1
Вложения
Тип файла: zip Get_NTFS_Space.zip (241.3 Кб, 18 просмотров)
21.12.2016, 23:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2016, 23:08
Привет! Вот еще темы с ответами:

Не запускаются ни bat, ни cmd файлы... - CMD/BAT
Стоит WinXP SP3. В общем захожу в любой bat и cmd файл, а мне все время пишет: Windows не удалось найти 'путь к файлу'. Проверьте, что...

Доступные уроки по CMD/BAT - CMD/BAT
Гугл и Яндекс молчат по этому поводу. Нужны ссылки на доступные (НЕ видео) уроки, чтобы изучить основы (циклы, синтаксис, переходы и т.д.)

Специальные символы в CMD/BAT - CMD/BAT
Добрый вечер. Вопрос по поводу специальных символов в BAT: &lt; , &gt; , &gt;&gt; , /? , * , ? , ; , | , &amp; , &amp;&amp; , || , ( ) , { }, может кто-нибудь...

Парсер txt файла? [CMD/BAT] - CMD/BAT
Добрый вечер. Подскажите, как с помощью BAT пропарсить файл 1.txt, содержащий строки вида: 192.168.102.123 kjdfsd87USHIhf ...


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

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

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