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

Batch (CMD/BAT)

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

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

15.10.2012, 00:56. Просмотров 283906. Ответов 145

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

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

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

145
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 834
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
30.12.2012, 04:46  [ТС] #16
Многопроцессное создание пустых файлов (бенчмарк для винчестера)
Код от: Dragokas
Спасибо Petya V4sechkin (OSZone) за ценную подсказку о синтаксисе запуска процесса.

P.S. Ниже "процессы" названы "потоками" (простите за эту глупую опечатку).

Настраиваемые параметры:
Set Dest=y:\m2 - каталог, в котором создавать файлы
Set /A Potok=50 - общее кол-во запускаемых потоков
Set /A PotokMax=8 - максимальное кол-во одновременно запускаемых потоков
Set /A Range=10000 - кол-во пустых файлов, создаваемых каждым потоком.

Развернуть код
Bash
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
::Многопотоковое создание пустых файлов ::by Alex Drago.kas
@echo off
Setlocal EnableDelayedExpansion EnableExtensions
Set Dest=y:\m2
Set /A Potok=50
Set /A PotokMax=8
Set /A Range=10000
 
if not exist "%Dest%" md "%Dest%"
::1 из потоков - управляющий (этот код) + 1(?не знаю почему)
Set /A PotokMax+=2
 
Set TimeS=%Time%
Call :TimeToMSec "%TimeS%" TimeS_ms
Echo Задание начато в %TimeS%
 
Set /A sS=0
For /L %%P in (1,1,%Potok%) do (
  Set /A sE=!sS!+%Range%-1
  start "Stream %%P" /min "CMD /Q /C For /L %%N in (!sS!,1,!sE!) do cd.>%Dest%\%%N"
  Set /A sS+=%Range%
  Echo Запущен поток № %%P
  Call :WaitForReady %PotokMax%
)
Echo Все потоки запущены.
Echo Ожидаю завершения заданий.
 
Call :WaitForReady 3&:: (+1 ?не знаю почему)
 
Set TimeE=%Time%
Call :TimeToMSec "%TimeE%" TimeE_ms
 
Echo Задание  начато  в  %TimeS%
Echo Задание завершено в %TimeE%
 
Set /A diff=TimeE_ms-TimeS_ms
Set /A diffSS=diff/100
Set /A diffms=%diff% %% 100
Set /A TotalFiles=Potok*Range
Set /A Speed=TotalFiles*100/diff
Echo Записано %TotalFiles% файлов.
Echo Затрачено: %diffSS%,%diffms% с.
Echo Скорость:  %Speed% файлов/с.
Echo.
pause
Goto :eof
 
:WaitForReady %PotokMax%
Set /A n=0
For /F "Delims=" %%A in ('tasklist^|Findstr /BLIC:cmd.exe') do (Set /A n+=1)
if %n% LSS %~1 Exit /B
ping -w 100 -n 1 192.168.254.254> nul
Goto :WaitForReady
 
:TimeToMSec %Time% %var_mSec%
For /F "Tokens=1-4 Delims=,:" %%A in ("%~1") do (
  Set /A HH=%%A
  Set MM=1%%B& Set /A MM=!MM!-100
  Set SS=1%%C& Set /A SS=!SS!-100
  Set mS=1%%D& Set /A mS=!mS!-100
)
Set /A %~2=(HH*60*60+MM*60+SS)*100+mS
Exit /B


В поданном коде создается 50*10000 = 0,5 млн. файлов, так что попытавшись открыть такую папку даже файловым менеджером все напрочь зависнет.
Чтобы удалить созданные файлы, прилагаю еще один бат-файл, который визуально отображает %-ый индикатор завершения удаления файлов.

Результаты тестов на моем SSD :)

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


Индикация процесса удаления папки
Развернуть код...
Bash
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
Set Fold=y:\m2
 
Echo Удаляю каталог %Fold%
Start /min cmd /c "rmdir /s /q "%Fold%"& exit"
 
Call :Count
Set /A Full=%n%
Echo 0%% - %Full% files
 
:Continue
Call :Count
Set /A Percent=100-(%n%*100/%Full%)
Echo %Percent%%%
ping -w 1000 -n 1 192.168.254.254> nul
if %n% neq 0 Goto :Continue
Echo.
Echo Ends.
pause
 
:Count
Set /A n=0
if not exist "%Fold%" Exit /B
dir /b "%Fold%">"%temp%\files.tmp"
for /F "Delims=" %%A in ('find /v /c ""^<"%temp%\files.tmp"') do (Set /A n=%%A)
::for /F "UseBackQ Delims=" %%A in ("%temp%\files.tmp") do @Set /A n+=1
Exit /B
4
Вложения
Тип файла: zip Speed.zip (1.5 Кб, 265 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 834
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
03.01.2013, 02:43  [ТС] #17
Помощник компиляции исходных кодов и проектов .NET (.cs / .sln (C#, VB.NET)) через консольный NET.FrameWork компилятор (csc или msbuild)
Автор: Dragokas

UPD. 02.03.2017 - добавил скрипт для msbuild.

Зачем нужен:
Например, в системе не установлена MS Visual Studio или другая среда разработки.

Требования:
Установленный NET.FrameWork, в некоторых случаях Windows SDK.

Использование:
1. Перетянуть на данный скрипт файл с исходным кодом C# (.cs / .sln) - "Drag & Drop"
2. Либо задать как аргумент в консоли, например, compile.cmd source.cs

Функционал:
Компиляция исходного кода C# с помощью консольного CSC.exe (msbuild) компилятора.
Все версии FrameWork-а скрипт находит в папке windows\microsoft.net, после чего дает Вам выбор какой версией компилировать и запоминает ее.
Ведет файл-протокола ошибок в DOS (CP-866) и WIN (CP-1251) кодировках и предлагает его сохранить.
Ошибки выводит также на экран. В случае их отсутствия, скрипт завершает работу без ожидания.

Внутри скрипта есть некоторые комментарии по детальным настройкам.

Кликните здесь для просмотра всего текста
Bash
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
@echo off& :: by Alex Dragokas -02.01.2013-
::Помощник компиляции исходников C#
Setlocal EnableDelayedExpansion EnableExtensions
 
::Задайте путь к файлу настроек скрипта
set FWCompilerPath=%temp%\FWCompile.cfg
::Задайте здесь полный путь к компилятору, либо он будет найден и сохранен автоматически в файл FWCompile.cfg
::set FWExec=c:\Windows\Microsoft.NET\Framework\v3.5\csc.exe
::Путь к временным файлам протокола ошибок
set log866=%temp%\compile_err866.log
set log1251=%temp%\compile_err.log
 
Echo Помощник компиляции исходных файлов C# (.cs)
Echo.
if "%1"=="" (
  Echo Перетяните исходный файл .cs на этот скрипт ^(Drag ^& Drop^),
  Echo или задайте его как аргумент, например "%~nx0" "c:\temp\source.cs"
  Echo.& pause& Goto :eof
)
 
::Если путь указан в шапке
if Defined FWExec goto :begin
::Читаю путь к компилятору из файла настроек
if exist "%FWCompilerPath%" for /f "UseBackQ delims=" %%A in ("%FWCompilerPath%") do set FWExec=%%A& goto :begin
 
Echo Выберите версию FrameWork, с помощью которой по-умолчанию будет компилироваться исходник
Echo.
for /f "delims=" %%A in ('dir /b /s /a:-d "%windir%\Microsoft.NET\csc.exe"') do (
  Set /A n+=1
  Set FW!n!=%%A
  for /f "tokens=4,5 delims=" %%r in ("%%A") do (
    echo %%r|find "64">nul
    if !errorlevel!==0 (set arch=x64) else (set arch=x32)
    echo !n!. !arch! %%s
  )
)
if not Defined n (Echo На компьютере не обнаружен установленный FrameWork& Echo.& pause& goto :eof)
Echo.
:FWenter
Set /p FWver="Ожидаю ввода: "
if "%FWver%"=="" Goto :FWenter
if %FWver% LSS 0 Goto :FWenter
if %FWver% GTR %n% Goto :FWenter
set FWExec=!FW%FWver%!
Echo %FWExec%> "%FWCompilerPath%"
 
::Дополнительные параметры
::/unsafe - компиляция блоков с прямым доступом к памяти
::/reference:"%Ref%\addon.dll" - подключить дополнительный модуль
::/target:library - скомпилировать как библиотеку классов; winexe - исполнительный файл Windows
::/res:"file.mp3" - внедрить в ресурсы внешний файл
::/debug - отображать отладочную информацию
::/warn:0 - уровень предупреждений
::/nologo - не отображать информацию об авторских правах
:begin
"%FWExec%" /target:exe /nologo /out:"%~dpn1.exe" "%~dpnx1" 1>"%log866%" 2>&1
if %errorlevel% neq 0 (
  Call :Recode
  Echo Во время компиляции возникла ошибка
  Echo.
  Type "%log866%"
  Echo.
  (set /p key=Нажмите Y, чтобы сохранить протокол ошибок в файл: )
  if /i "!key!"=="Y" (move /y "%log1251%" "%~dp1"& del /q "%log866%") else (del /q "%log866%"& del /q "%log1251%")  
) else (del /q "%log866%")
Exit /B
 
:Recode
::Файл с кодировкой WIN-866
set FileIn=%log866%
::Результат, куда записывать OEM-1251
set FileOut=%log1251%
 ::chcp 1251> nul
for /f "delims=" %%a in (%FileIn%) do (
  if not defined cpReady (
    chcp 1251> nul
    set CpReady=True
  )
  call :convert "%%a"
)
chcp 866> nul
exit /B
 
:convert
echo %~1>>"%FileOut%"
Exit /B


P.S. Скрипт для msbuild - упрощённый (лог-файл не ведётся).

Кликните здесь для просмотра всего текста
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
@echo off& :: by Alex Dragokas -02.03.2017-
::Помощник компиляции исходников C#
Setlocal EnableDelayedExpansion EnableExtensions
 
::Задайте здесь полный путь к компилятору, либо будет предложен выбор
::set FWExec=%SystemRoot%\Microsoft.NET\Framework\v3.5\msbuild.exe
 
Echo Помощник компиляции проектов .NET (.sln)
Echo.
if "%1"=="" (
  Echo Перетяните исходный файл .cs на этот скрипт ^(Drag ^& Drop^),
  Echo или задайте его как аргумент, например "%~nx0" "c:\temp\source.sln"
  Echo.& pause& Goto :eof
)
 
::Если путь указан в шапке
if Defined FWExec goto :begin
 
Echo Выберите версию FrameWork, с помощью которой по-умолчанию будет компилироваться исходник
Echo.
for /f "delims=" %%A in ('dir /b /s /a:-d "%windir%\Microsoft.NET\msbuild.exe"') do (
  Set /A n+=1
  Set FW!n!=%%A
  for /f "tokens=4,5 delims=" %%r in ("%%A") do (
    echo %%r|find "64">nul
    if !errorlevel!==0 (set arch=x64) else (set arch=x32)
    echo !n!. !arch! %%s
  )
)
if not Defined n (Echo На компьютере не обнаружен установленный FrameWork& Echo.& pause& goto :eof)
Echo.
:FWenter
Set /p FWver="Ожидаю ввода: "
if "%FWver%"=="" Goto :FWenter
if %FWver% LSS 0 Goto :FWenter
if %FWver% GTR %n% Goto :FWenter
set FWExec=!FW%FWver%!
 
SetLocal DisableDelayedExpansion
 
:begin
"%FWExec%" "%~1" /t:rebuild /p:Configuration=Debug /p:Platform="any cpu" /clp:Nosummary
if %errorlevel% neq 0 (
  echo.
  Echo ^>^>^> Во время компиляции возникла ошибка ^<^<^<
  pause>NUL
)
3
Вложения
Тип файла: zip Compiler.zip (2.3 Кб, 187 просмотров)
Тип файла: zip msbuild_me2.zip (1.1 Кб, 15 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 834
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
06.01.2013, 02:03  [ТС] #18
Отслеживание зависшего процесса и его перезапуск с указанным приоритетом
Автор: Dragokas

Все параметры настраиваемы (см. начало кода и спойлер). Комментарии писал на английском, уж как есть.

Принцип работы:
Задаем имя процесса(ов), который будем отслеживать.
В системе могут быть несколько процессов с одинаковым именем. Скрипт идентифицирует их по PID и не путается.
Если найден процесс с указанным именем и статусом "Not responding",
начинается валидация (повторная проверка этого статуса на протяжении заданного времени и указанное кол-во раз).
(а вдруг процесс подвис на секунду - не "убивать" же его из-за этого!!!)
Если все проверки позитивны, ищем полный путь к процессу по номеру его Process ID (используется инструментарий WMIC).
Принудительно завершаем процесс по PID.
Выжидаем указанную задержку перед повторным запуском.
Запускаем тот же процесс с указанным приоритетом в минимизированном виде.

Настройки:

Можно задавать такие паузы (в мс.):
1) между проверками статуса "Не отвечает".
2) продолжительность времени и кол-во дополнительных проверок валидации статуса за это время.
3) перед новым запуском завершенного приложения.

Запуск в минимизированном виде:
1 - Да, 0 - Нет.

Приоритеты запускаемого процесса:
1 - низкий
2 - ниже среднего
3 - средний
4 - выше среднего
5 - высокий
6 - в реальном времени

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


Upd.3.
Подправлено получение пути к процессу из правильного свойства WMIC Process (ExecutablePath вместо CommandLine).
Добавлена принудительная минимизация окна с помощью утилиты NirCMD (некоторые программы восстанавливают окно при использовании Start /MIN).
В силу особенностей NirCMD процесс нужно вручную задавать на выбор: по имени класса или по имени (части имени) окна.
Добавлен автоперезапуск процесса, если через 10 сек. после его запуска оно не набрало указанное число КБайт в оперативной памяти.

Скрипт обсуждается здесь Отслеживание зависания (состояния "не отвечает") программы и её перезапуск
7
Вложения
Тип файла: rar Not Responding.rar (3.5 Кб, 299 просмотров)
Тип файла: rar Not Responding3.rar (111.3 Кб, 390 просмотров)
FraidZZ
Ex-Member
3903 / 1529 / 229
Регистрация: 06.01.2013
Сообщений: 4,052
Завершенные тесты: 1
08.01.2013, 21:45 #19
Помощь по всем командам вашей версии Windows / DOS

Развврнуть код...
Bash
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
@echo off
setlocal enabledelayedexpansion
if exist "help.txt" (del help.txt)
help>>help.txt
del help2.txt
FOR /F "usebackq" %%a IN ("help.txt") DO (
 set string=%%~a
 if "!string:~0,1!"=="A" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="B" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="C" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="D" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="E" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="F" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="G" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="H" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="I" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="J" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="K" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="L" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="M" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="N" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="O" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="P" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="Q" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="R" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="S" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="T" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="U" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="V" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="W" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="X" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="Y" (echo !string!>>help2.txt)
 if "!string:~0,1!"=="Z" (echo !string!>>help2.txt)
)
del help.txt
FOR /F "usebackq tokens=1,2*" %%a IN ("help2.txt") DO (
 echo ====================>>help.txt
 echo HELP FOR %%a>>help.txt
 echo %%a
 %%a /?>>help.txt
)
echo OK
pause>nul
timeout /t 1 /NOBREAK>nul

После запуска появятся два текстовых файла.
По ходу действия программа будет писать вам, какая команда сейчас обрабатывается.
HELP2 - список доступных вам команд.
HELP - собственно справка по каждой из них.
4
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 834
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
15.01.2013, 02:20  [ТС] #20
Прогресс-бар копирования файлов
Автор: Ris

Взято из этой темы.
Версия 1.5
Bash
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
@echo off
::Первый пааметр - это откуда копировать(путь у папке)
::Второй параметр - это куда копировать(путь у папке)
::Третий параметр - это надо ли копировать вложенный папки (+s - если надо, -s если не надо)
::Четвертый параметр - это что копировать(расширение файлов без точки, не указывайте - если все файлы)
if "%~1"=="" goto :EOF
set otkyda=%~1
if "%~2"=="" goto :EOF
set kyda=%~2
if /i "%~3"=="+s" (set s=^/s) else (set s=)
if "%~4"=="" (set pac=^*) else (set pac=%~4)
setlocal enabledelayedexpansion
set /a q=0
echo Copy...0%%
echo °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
cd /d "%~1"
for /f "tokens=*" %%i in ('dir /a:-d /b /-c %s% "*.%pac%"') do (set /a sall+=%%~zi)
for /f "tokens=*" %%i in ('dir /a:-d /b /-c %s% "*.%pac%"') do (call :mycopy "%%i" %%~zi)
cls
echo Copy...100%%
echo ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ
goto :EOF
exit
:mycopy
if not %2 LSS 200000000 (echo File size is larger than 200MB.&pause&exit)
set p=%~dp1
call set x=%%p:%otkyda%=%%
xcopy /q /s /y %1 "%kyda%%x%" > nul
set /a proc=10*%2/(%sall%/1000)
if %2 LSS 10000 set /a proc=%2*10000/%sall%
set /a q=%q%+%proc%
cls
echo Copy...%q:~0,-2%.%q:~-2%%%
set /a qb=(%q%*80)/10000
if "%qb%"=="%qb_pr%" (echo %bar%%barx%&exit /b)
set /a qbx=80-%qb%
set bar=
set barx=
for /l %%i in (1,1,%qb%) do (set bar=!bar!Ы)
for /l %%i in (1,1,%qbx%) do (set barx=!barx!°)
echo %bar%%barx%
set qb_pr=%qb%
exit /b

Юзаем, например, так:
Bash
1
copybar "C:\temp" "%cd%\temp" +s rar
2
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 834
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
23.02.2013, 05:03  [ТС] #21
Process Change Monitor
Мониторинг и протоколирование запускаемых/завершаемых процессов в момент работы скрипта.
Автор: Dragokas

Обсуждается здесь: Мониторинг запускаемых процессов

02.11.2016 Вышла версия 2.2 (vbs). Детали здесь.

cmd-версия (v2.1.):


vbs-версия:
0
Миниатюры
Полезные BAT/CMD скрипты  
Вложения
Тип файла: rar TaskC2.1 (устаревшая).rar (1.9 Кб, 74 просмотров)
Тип файла: zip Task_Monitor_v2.2.zip (2.8 Кб, 51 просмотров)
sov44
1754 / 738 / 126
Регистрация: 09.04.2011
Сообщений: 1,312
11.03.2013, 13:35 #22
Транслитерация файлов, в именах которых есть кириллица
Автор: gora (oszone)
Bash
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
:: Кодировка файла Кириллица DOS (866)
SetLocal EnableDelayedExpansion
:: Путь к обрабатываемой папке
Set Folder=e:\Temp\1
 
:: Список замен
Set preset=а_a б_b в_v г_g д_d е_e ё_yo ж_zh з_z и_i й_i к_k л_l м_m н_n о_o п_p р_r с_s т_t у_u ф_f х_kh ц_c ч_ch ш_sh щ_sh ъ_. ы_y ь_. э_e ю_yu я_ya А_A Б_B В_V Г_G Д_D Е_E Ё_Yo Ж_Zh З_Z И_I Й_I К_K Л_L М_M Н_N О_O П_P Р_R С_S Т_T У_U Ф_F Х_Kh Ц_C Ч_Ch Ш_Sh Щ_Sh Ъ_. Ы_Y Ь_. Э_E Ю_Yu Я_Ya
 
:: После проверки слово ECHO удалить
For /F "tokens=* delims=" %%A In ('Dir /S /B /A:-D "%folder%"') Do (
    Call :_translit "%%~nA"
    Echo Ren "%%A" "!Result!%%~xA"
)
Pause
Exit
 
:_translit
Set Data=%~1
Set Data=%Data: =_%
Set Result=
:_loop
Set Char=%Data:~,1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If %Char%==%%A Set Char=%%B
Set Result=%Result%%Char%
Set Data=%Data:~1%
If Defined Data GoTo _loop
GoTo :EOF
0
Charles Kludge
Клюг
7636 / 3151 / 363
Регистрация: 03.05.2011
Сообщений: 8,382
14.03.2013, 18:29 #23
Преобразование текстового файла в кодировку Unicode

Bash
1
2
3
4
5
6
7
8
@echo off
:: преобразование текстового файла в unicode
:: вызов: to_uni infile outfile codepage
For /f "tokens=2 delims=:" %%G in ('CHCP') do Set _codepage=%%G
CHCP %3 >NUL
CMD.EXE /D /A /C (SET/P=яю)<NUL > %2 2>NUL
CMD.EXE /D /U /C TYPE %1 >> %2
CHCP %_codepage%
Код
to_uni.cmd входной_файл_в_866_или_1251 выходной_файл_в_юникоде кодовая_страница_входного_файла
Пример:
Код
to_uni.cmd input_file output_file 866
Текст будет чисто в бинарном юникоде, но маркер в самом начале "яю" позволяет корректно открывать его во многих редакторах, поддерживающих юникод.
0
Charles Kludge
Клюг
7636 / 3151 / 363
Регистрация: 03.05.2011
Сообщений: 8,382
22.03.2013, 15:19 #24
Конвертация даты/времени из/в UNIX-формат(в секундах после 1-янв-1970 00:00:00)
Практическое применение: в регистри довольно много значений хранится именно в этом формате. Ну и быстрое сравнение дат файлов с определённной датой при травесе каталога.
Вытаскиваем дату установки виндавса:
Bash
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
@echo off & setlocal ENABLEEXTENSIONS
:: requires REG.EXE Version 2.0 or later
set key="HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
set val="InstallDate"
for /f "delims=" %%a in ('reg query %key% /v %val%^|find %val%') do (
  for %%b in (%%a) do set secs=%%b
)
call :SecsToDate %secs% yy mm dd hh nn ss
echo/Windows installation date is: %yy%-%mm%-%dd% %hh%:%nn%:%ss%
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:SecsToDate %secs% yy mm dd hh nn ss
::
:: By:   Ritchie Lawrence, [url]http://www.commandline.co.uk[/url]
::
:: Func: Возвращает дату и время из кол-ва секунд прошедших от
::       1-янв-1970 00:00:00.(UNIX-формат)
:: 
:: Args: %1 секунды для конвертации (по значению)
::       %2 перем. для года(по ссылке)
::       %3 перем. для месяца, 01-12(по ссылке)
::       %4 перем. для дня месяца, 01-31(по ссылке)
::       %5 перем. для часов, 00-24(по ссылке)
::       %6 перем. для минут, 00-59(по ссылке)
::       %7 перем. для секунд, 00-59(по ссылке)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set /a i=%1,ss=i%%60,i/=60,nn=i%%60,i/=60,hh=i%%24,dd=i/24,i/=24
set /a a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
(if %hh% LSS 10 set hh=0%hh%)&(if %nn% LSS 10 set nn=0%nn%)
if %ss% LSS 10 set ss=0%ss% 
endlocal&set %7=%ss%&set %6=%nn%&set %5=%hh%&^
set %4=%dd%&set %3=%mm%&set %2=%yy%&goto :EOF
Конвертим текущую дату/время в секунды:
Bash
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
@echo off 
setlocal ENABLEEXTENSIONS
 
call :DateToSecs %date:~-4% %date:~-7,2% %date:~-10,2% %time:~,2% %time:~3,2% %time:~6,2% secs
echo/%secs% seconds have elapsed since 1970-01-01 00:00:00
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToSecs %yy% %mm% %dd% %hh% %nn% %ss% secs
::
:: By:   Ritchie Lawrence, [url]http://www.commandline.co.uk[/url]
::
:: Func: возвращает кол-во секунд после 1-янв-1970 00:00:00
::       для данных даты и времени(UNIX-формат)
:: 
:: Args: %1 год, 2 или 4 цифры (по значению)
::       %2 месяц, 1/01 по 12, лидирующий 0 допустим (по значению)
::       %3 день,  1/01 по 31, лидирующий 0 допустим (по значению)
::       %4 часы, 0/00 по 23 (по значению)
::       %5 минуты, 00-59 (по значению)
::       %6 секунды, 0-59 или 00-59 (по значению)
::       %7 переменная для возврата значения (по ссылке)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3&set hh=%4&set nn=%5&set ss=%6
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
if 1%hh% LSS 20 set hh=0%hh%
::if {%nn:~2,1%} EQU {p} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
::if {%nn:~2,1%} EQU {a} if "%hh%" EQU "12" set hh=00
::if {%nn:~2,1%} GEQ {a} set nn=%nn:~0,2%
set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
set /a j=j*86400+hh*3600+nn*60+ss
endlocal&set %7=%j%&goto :EOF
1
Charles Kludge
Клюг
7636 / 3151 / 363
Регистрация: 03.05.2011
Сообщений: 8,382
24.03.2013, 19:30 #25
Немного сетки: GetIP/GetMAC/Get default gateway
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@echo off & setlocal ENABLEEXTENSIONS
call :GetIP ip
echo/IP Address is: %ip%
goto :EOF
 
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetIP ip
::
:: By:   Ritchie Lawrence, [url]http://www.commandline.co.uk[/url]
::
:: Func: Получает Ip-addr сетевушки. Если сетевушек несколько, возвращает адрес той,
::   к которой прибит default route. В случае ошибки возвращает 0.0.0.0
:: 
:: Args: %1 перем. для получения IP-addr.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "i=0.0.0.0" & set "j="
for /f "tokens=4" %%a in ('route print^|findstr 0.0.0.0.*0.0.0.0') do (
  if not defined j for %%b in (%%a) do set "i=%%b" & set "j=1")
endlocal & set "%1=%i%" & goto :EOF
Bash
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
@echo off & setlocal ENABLEEXTENSIONS
call :GetMAC mac
echo/MAC address is: %mac% or classic form: %mac:-=^:%
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetMAC mac
::
:: By:   Ritchie Lawrence, 2003-09-24, [url]http://www.commandline.co.uk[/url]
::
:: Func: Получает MAC-addr. сетевушки в формате XX-XX-XX-XX-XX-XX.
::   Если сетевушек несколько, возвращает адрес той,
::   к которой прибит default route. В случае ошибки возвращает 00-00-00-00-00-00
:: 
:: Args: %1  перем. для получения MAC-addr.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "m=00-00-00-00-00-00" & set "i=" & set "j="
set "n=0" & set "c=ipconfig/all" & set "f=findstr"
for /f "tokens=4" %%a in ('route print^|findstr 0.0.0.0.*0.0.0.0') do (
  if not defined j for %%b in (%%a) do set "i=%%b" & set "j=1")
set "j="
if not defined i endlocal & set "%1=%m%" & goto :EOF
for /f "delims=:" %%a in ('%c%^|%f%/n IP.*Address.*%i%') do set /a n=%%a-6
for /f "delims=" %%a in ('%c%^|more/e +%n%^|%f% Physical.Address') do (
  if not defined j for %%b in (%%a) do set "m=%%b" & set "j=1")
endlocal & set "%1=%m%" & goto :EOF
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off & setlocal ENABLEEXTENSIONS
call :GetDG dg
echo/Default Gateway is: %dg%
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetDG dg
::
:: By:   Ritchie Lawrence, [url]http://www.commandline.co.uk[/url]
::
:: Func: Получает default gateway. В случае ошибки возвращает 0.0.0.0
:: 
:: Args: %1 перем. для получения default gateway
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "g=0.0.0.0" & set "j="
for /f "tokens=3" %%a in ('route print^|findstr 0.0.0.0.*0.0.0.0') do (
  if not defined j for %%b in (%%a) do set "g=%%b" & set "j=1")
endlocal & set "%1=%g%" & goto :EOF
1
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 834
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
24.03.2013, 22:37  [ТС] #26
Расчёт индекса массы тела и идеального веса
Автор: sov44

Bash
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
SetLocal enabledelayedexpansion
color 1a
title Расчёт индекса массы тела и идеального веса
mode con: cols=70 lines=26
echo.
echo.
set /p rost="Мой рост в см. :                      "
set /p wes="Мой вес в кг. :                       "
set /p pol="Мой пол [м\ж] :                       "
set /p woz="Мой возраст :                         "
set /p grd="Моя окружность грудной клетки в см. : "
 
echo.
set /a ii=%rost%
set /a ind=%wes%*1000000/(%ii%*%ii%)
set uu=%ind:~0,2%
Echo.
Echo               Мой индекс массы тела %UU%
Echo.
Echo  Индекс массы тела менее 18    - Недостаточная масса тела
Echo  Индекс массы тела от 18 до 30 - Норма
Echo  Индекс массы тела от 30 до 35 - Предожирение
Echo  Индекс массы тела от 35 до 40 - Ожирение 1 степени
Echo  Индекс массы тела от 40 до 45 - Ожирение 2 степени
Echo  Индекс массы тела более 45    - Ожирение 3 степени 
 
if /i "%pol%"=="м" set /a ivh=48+11*(%ii%-150)/10
if /i "%pol%"=="ж" set /a ivh=45+9*(%ii%-150)/10
 
echo.
echo.
echo  Мой идеальный вес по Хаммонду (рост и пол)  :               %ivh% кг.
 
if "%woz%" LEQ 40 (set /a ivb=%ii%-110) else (set /a ivb=%ii%-100)
echo  Мой идеальный вес по Броку (рост и возрост) :               %ivb% кг.
 
set /a ivbh=%ii%*%grd%/240
echo  Мой идеальный вес по Брудхарду (рост и окружность груди) :  %ivbh% кг.
 
set /a ivl=(%ii%-100)-((%ii%-150)/2)
echo  Мой идеальный вес по Лоренцу (рост) :                       %ivl% кг.
 
if /i "%pol%"=="м" set /a ivk=((400*%ii%/254)-128)*453/1000
if /i "%pol%"=="ж" set /a ivk=((350*%ii%/254)-108)*453/1000
 
echo  Мой идеальный вес по Куперу (рост) :                        %ivk% кг.
echo.
 
pause>nul
0
Вложения
Тип файла: zip ind_massy2.zip (838 байт, 204 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 834
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
26.03.2013, 23:25  [ТС] #27
Создание нуль-копии папки для выкладывания на форуме
Автор: gora (oszone)

На этом форуме часто приходится наблюдать следующую картину. ТС пытается сформулировать свою задачу и "на пальцах" объяснить в каких папках у него находятся файлы\папки, которые ему требуется обработать соответствующим образом. Оценить структуру папок\файлов, их взаимное расположение, их имена и расширения, а также отсутствие в именах спец. символов, по такому описанию бывает крайне затруднительно. Переписка с ТС и выяснение всех деталей структуры занимает порой большую часть ветки и "напрягает" отвечающих созданием ненужных для ТС вариантов скриптов, основанных на гаданиях\предположениях.
Гораздо удобнее было бы увидеть эту структуру, но папки и файлы в них могут иметь большой размер или содержать конфиденциальную информацию. Для таких случаев удобно пользоваться нуль-копией папки\папок, в которой сохранена вся структура вложенных папок и находящихся в них файлов с сохранением их названий, но все файлы имеют нулевой размер и не содержат ни какой информации.

Предлагаю вариант скрипта для создания такой нуль-копии папки.

После создания нуль-копии ее можно сравнить с оригиналом, на предмет отсутствия ошибок в структуре, заархивировать, и архив прикреплять к сообщению при написании ТЗ.

Развернуть код

Bash
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
@Echo Off
ChCp 1251>Nul
If "%~1"=="" (
    Echo The correct syntax:
    Echo %~nx0 "Full\path\to\Folder 1" ["Full\path\to\Folder 2"] ...
    Pause>Nul
    Exit
)
For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set t=%%i
Set zDT=_Zero_%t:~2,2%%t:~4,2%%t:~6,2%_%t:~8,2%-%t:~10,2%
Set f=%~1& Set cnt=2& Set c=0& Set cf=0
:_loop
    If "%f:~0,1%"=="\" Set /A cnt+=1
    Set f=%f:~1%
If Defined f GoTo _loop
Set /A cntI=cnt-1
 
If "%~2"=="" (
    If Exist "%~1\*" Call :_makeDir "%~1%zDT%"
    Call :_item "%~1" "%~1%zDT%" "%~1" "%cnt%" "%~1%zDT%" "%~dpn1%zDT%%~x1"
    If Exist "%~1\*" For /R "%~1%zDT%" %%f In (.) Do Set /A cf+=1
) Else (
    Call :_makeDir "%~dp1%zDT%"
    For %%i In (%*) Do Call :_item "%%~i" "%~dp1%zDT%\%%~nxi" "%~dp1%%~nxi" "%cntI%" "%~dp1%zDT%" "%~dp1%zDT%\%%~nxi"
    For /R "%~dp1%zDT%" %%f In (.) Do Set /A cf+=1
)
Echo Complete!
Echo Folders=%cf%   Files=%c%
Echo.
Pause
Exit
 
:_item
If Exist "%~1\*" (
    xCopy /T /E /H /K "%~1" "%~2\"|| GoTo :_err
    PushD "%~3"
    For /F "tokens=%~4* delims=\" %%a In ('Dir /S /B /A:-D') Do (
        If "%%~b"=="" (CD.>"%~5\%%~a") Else CD.>"%~5\%%~a\%%~b"
        Set /A c+=1
    )
    PopD
) Else (
    CD.>"%~6"
    Set /A c+=1
)
GoTo :EOF
 
:_err
For /R "%~2" %%f In (.) Do Set erf=%%f
Set erf=%erf:~0,-2%
Call Set erf=%%erf:%~2=%~1%%
RD /S /Q "%~5"
Echo Error xCopy on file:
Echo %erf%
Pause>Nul
Exit
 
:_makeDir
If Exist "%~1" RD /S /Q "%~1"
MD "%~1"
GoTo :EOF
1
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 834
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
27.03.2013, 02:01  [ТС] #28
Разноцветный вывод в консоли.
Автор: Dragokas

Ограничения кода:
1) В конце строки всегда печатается символ "двоеточие".
2) Нельзя печатать текст из символов, которые не могут быть использованы в имени файла |\:"<>?/*, а также . (точка) и другие служебные CMD.
3) Строка всегда заканчивается переносом каретки.
4) В сценарии используется символ BackSpace (для функции отступа), который нельзя создать обычным блокнотом ^_^

В строке № 57 Set _BS=здесь поставить символ BackSpace (0x08)
Bash
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
@echo off
SetLocal
mode con: cols=60 lines=10
Color 9A
 
Set Text=Maded by Dragokas
Set Color=1A
::left, right, center
Set Alignment=right
 
Call :ColorText "%text%" "%color%" "%Alignment%"
Call :ColorText "Working with Colors" "1d" "center"
Echo Press any key...
pause>nul
goto :eof
 
:ColorText %1-in.Text %2-in.Color.HEX %3-Alignment
  Call :SetTextPosition "%~1" "%~3"
  md "%temp%\_bin2" 2>nul
  pushd "%temp%\_bin2"
  echo.>"%~1"
  findstr /V /a:%~2 "1" "*"
  popd
  rd /s /q "%temp%\_bin2"
  Exit /B
 
:SetTextPosition %1-in.Text %2-in.Alignment
  if /i "%~2" neq "left" (
    call :GetConsoleWidth _ConWidth
    call :var_count "%~1" _len
    SetLocal EnableDelayedExpansion
    if /i "%~2"=="right" (
      Set /A _ind=!_ConWidth!-!_len!-1
      Call :indent !_ind!
    )
    if /i "%~2"=="center" (
      Set /A _ind=^(!_ConWidth!-!_len!^)/2
      Call :indent !_ind!
    )
    EndLocal
  )
  Exit /B
 
:GetConsoleWidth %1-out.ConsoleWidth
  For /F "skip=4 tokens=2" %%w In ('mode con') Do Set %~1=%%w& Exit /B
 
:var_count %1-in.Text %2.out.Len.of.Text
  set _var=%~1& set _count=0
  :count--
  set _var=%_var:~1%
  set /a _count+=1
  if not defined _var (set %~2=%_count%& exit /b) else (goto :count--)
 
:indent %1-in.Count.of.Spaces
  SetLocal EnableDelayedExpansion
  ::Здесь нужно заменить символ ниже на BackSpace (код 0x08) <<<<<---------
  Set _BS=
  Set _Spaces=
  for /L %%C in (1,1,%~1) do Set "_Spaces=!_Spaces! "
  <nul set /p "_Spaces=_%_BS%%_Spaces%"
  EndLocal& Exit /B


Практическое применение: см. Весна :)
P.S. Обсуждение: Цветной вывод в консоли (обсуждение кода розы)
3
Миниатюры
Полезные BAT/CMD скрипты  
Вложения
Тип файла: rar Colors.rar (869 байт, 374 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 834
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
29.03.2013, 01:18  [ТС] #29
Получение серийного номера всех съемных устройств и физических жестких дисков (не разделов).
Получение имен разделов физических накопителей (кроме оптических).
(основано на технологии WMI)
ver.1.2. (от 30.03.2013)
Автор: Dragokas
Совместимость: Windows 7, XP

История изменений:
1.2. Более нет необходимости в запуске скрипта с повышенными правами (для обхода представления серийного номера в виде Reverse Hex числа).
1.1. Добавлена возможность получения серийного номера HDD.

Развернуть код

Bash
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
@echo off&:: by Alex Dragokas
Setlocal EnableDelayedExpansion EnableExtensions
Echo.
::Получаем PNPDeviceID и PhysicalDrive Name устройств, подключенных по интерфейсу USB
echo Перечень cъемных накопителей:
echo.
For /F "Skip=2 Tokens=2-4 delims=," %%i In (
  'WMIC DiskDrive Where InterfaceType^="USB" Get Name^,PNPDeviceID^,Model /Value /format:csv 2^>nul'
) do (
    Set AtLeastOneDevice=true
    Call :Get_USB_SN "%%k" Device_SN
    Call :GetPartition "%%j" Drives
    Echo Model: %%i
    Echo %%j
    Echo Disk^(s^):     !Drives!
    Echo Device S/N:         "!Device_SN!"
    Echo.
)
if not defined AtLeastOneDevice Echo Съемных USB накопителей не обнаружено.
Echo.
Echo Перечень жестких дисков:
Echo.
For /F "Skip=2 Tokens=2-4 delims=," %%i In (
  'WMIC DiskDrive Where "InterfaceType^!^='USB'" Get Name^,PNPDeviceID^,Model /Value /format:csv'
) do (
    Call :GetPartition "%%j" Drives
    Call :Get_HDD_SN "%%j" Device_SN
    Echo Model: %%i
    Echo %%j
    Echo Disk^(s^):     !Drives!
    Echo Device S/N:         "!Device_SN!"
    Echo "!Device_SN!">>%~dp0file.txt
    Echo.
)
pause>nul
Goto :eof
 
::Парсим часть с серийным номером устройства
:Get_USB_SN %1-in.PNPDeviceID %2-out.Device_S/N
  Set "%~2="
  Set "PNP=%~1"
  Set "PNP=%PNP:\=" "%"
  Set "PNP=%PNP:;=" "%"
  Set "PNP=%PNP:&=" "%"
  Set _Prev=
  For %%i in ("%PNP%") do (
    if "!_Prev:~0,4!"=="REV_" (Set "%~2=%%~i"& Exit /B)
    Set "_Prev=%%~i"
  )
  Exit /B
 
:Get_HDD_SN %1.in-PhysicalDrive_Name %2-out.Device_S/N
  Set "tag=%~1"
  Set "tag=%tag:\=\\%"
  For /F "UseBackQ skip=2 tokens=2 delims=," %%i In (
    `wmic path Win32_PhysicalMedia where "tag='%tag%'" Get SerialNumber /format:csv`
  ) do call set "_serial=%%i"
  ::Выше используется Call, чтобы удалить служебный символ 0x0D из переменной
  set "_serial=%_serial: =%"
  ::Проверяем признак 16-ричного кода (ответ длинной 40 символов)
  if "%_serial:~39,1%" neq "" Call :Hex_To_String "%_serial%" "_serial"
  set "%~2=%_serial%"
  Exit /B
 
:Hex_To_String %1-in.Reversed.Hex.Number %2-out.String
  SetLocal& set "x16=%~1"
  set n=45
  for %%A in (- . / 0 1 2 3 4 5 6 7 8 9) do set s.!n!=%%A& set /a n+=1
  set n=65
  for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set s.!n!=%%A& set /a n+=1
  set n=97
  for %%A in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set s.!n!=%%A& set /a n+=1
  set xs=
  for /L %%C in (0,4,8184) do (
    if "!x16:~%%C,1!"=="" goto _ex_Hex
    set /A cplus=%%C+2
    call set /A x10=0x%%x16:~!cplus!,2%%
    call set xs=!xs!%%s.!x10!%%
    set /A x10=0x!x16:~%%C,2!
    call set xs=!xs!%%s.!x10!%%
  )
  :_ex_Hex
  EndLocal& set "%~2=%xs%"& Exit /B
 
::Конвертация PhysicalDrive Name -> Partition Names -> Drive Names
  :GetPartition %1.in-PhysicalDrive_Name %2-out.Drive_Names
  Set "%~2="
  For /F "skip=2 delims==, tokens=3,6-7" %%i In (
    'WMIC path Win32_DiskDriveToDiskPartition get /format:csv'
  ) do (
    if %%i=="%~1" (
      For /F "skip=2 delims==, tokens=3-4,7" %%I In (
        'WMIC path Win32_LogicalDiskToPartition get Antecedent^,Dependent /format:csv'
      ) do (
        if "%%I,%%J"=="%%j,%%k" Set "%~2=!%~2! %%K"
  )))
  Exit /B
2
Миниатюры
Полезные BAT/CMD скрипты  
Вложения
Тип файла: zip USBDrive_SN4.zip (2.2 Кб, 416 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 834
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
30.03.2013, 02:20  [ТС] #30
Перекодировщик Reversed Hex в символьную строку
(подпрограмма)

Bash
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 EnableExtensions EnableDelayedExpansion
 
set x16=434f2d5a3238585741315758374437454f303856
Call :Hex_To_String "%x16%" str
echo.%str%
 
pause>nul
exit /B
 
 
:Hex_To_String %1-in.Reversed.Hex.Number %2-out.String
  SetLocal& set "x16=%~1"
  set n=45
  for %%A in (- . / 0 1 2 3 4 5 6 7 8 9) do set s.!n!=%%A& set /a n+=1
  set n=65
  for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set s.!n!=%%A& set /a n+=1
  set n=97
  for %%A in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set s.!n!=%%A& set /a n+=1
  for /L %%C in (0,4,8184) do (
    if "!x16:~%%C,1!"=="" goto _ex_Hex
    set /A cplus=%%C+2
    call set /A x10=0x%%x16:~!cplus!,2%%
    call set xs=!xs!%%s.!x10!%%
    set /A x10=0x!x16:~%%C,2!
    call set xs=!xs!%%s.!x10!%%
  )
  :_ex_Hex
  EndLocal& set "%~2=%xs%"& Exit /B
2
30.03.2013, 02:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 02:20
Привет! Вот еще темы с ответами:

Не запускаются ни 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 ...


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

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

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