С Новым годом! Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/2466: Рейтинг темы: голосов - 2466, средняя оценка - 4.61
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
23.01.2013, 20:55 21
Author24 — интернет-сервис помощи студентам
Капитальное исследование strlen(); - несколько способов с таймингами.

Не по теме:

Переводить лень, хоть код и неочевиден.

1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2013, 20:55
Ответы с готовыми решениями:

Как задать вопрос на форуме Batch и выделить свой код? (■■■ Кто первый раз в этом разделе ■■■)
Как задать вопрос на форуме Batch и выделить свой код? Важно знать: у нас есть "тема-каталог...

WiLD: Алгоритм работы ■ (основное обсуждение) ■
Обсуждение части проекта: https://www.cyberforum.ru/cmd-bat/thread866656.html Полезные ссылки:...

Lenovo G500 (LA-9632 rev 1.0) не включается
Добрый день. Ноутбук пришел перебитым кабелем з.у. В EC KB9012QF дырка, кз по B+. По B+ в к.з. был...

Lenovo G500 (LA-9632) - Сильно греется хаб
Всем добрый день. Принесли ноут Lenovo G500 мать la-9632 При включении не было изображение....

Книжный каталог - С чего начать?
Есть задание, есть базовые знания Java. Подскажите пожалуйста, что необходимо изучить для...

53
1748 / 353 / 41
Регистрация: 15.10.2012
Сообщений: 550
25.01.2013, 15:56 22
Проверка на содержание подстроки в строке (быстрый вариант)

1. Простой вариант - проверка на содержимое в строке заданной подстроки
Bash
1
2
set a=qwerty
if "%a:ty=%" neq "%a%"  echo "ty" present in string
Принцип работы: если подстрока присутствует в строке, она будет удалена и результат не будет равен исходной строке.
Не работает с пустыми строками.

2. Вариант, когда подстрока тоже в переменной
Bash
1
2
3
4
setlocal enabledelayedexpansion
set a=asdfgh
set b=df
if "!a:%b%=!" neq "!a!"  echo "%b%" present in string "%a%"
1
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
31.01.2013, 11:24 23
Day-of-the-Week aka день недели:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
:: Day of the Week
@echo off
set dowstr="ВсПнВтСрЧтПтСб"
set /a dd = %date:~0,2%
set /a mm = %date:~3,2%
set /a yy = %date:~6,4%
 
set /a a = ((14 - %mm%) / 12)
set /a y = (%yy% - %a%)
set /a m = (%mm% + (12 * %a%) - 2)
set /a dow=((7000 + (%dd% + %y% + (%y% / 4) - (%y% / 100) + (%y% / 400) + ((31 * %m%) / 12))) %% 7)
set /a dowi=%dow%*2+1
call set dowc=%%dowstr:~%dowi%,2%%
echo День недели: %dow%  %dowc%
Очнь пользительная фишка - в пятницу нужным людям можно отправить СМСку с вопросом "Где и во сколько?"
0
94 / 94 / 4
Регистрация: 25.06.2012
Сообщений: 278
10.02.2013, 01:59 24
Порыскав в инете нашел интересные вещи с использованием %random%. Здесь вроде бы ничего похожего не увидел, так что вот:

1. Генератор паролей.

С помощью операций над переменными команды SET VAR=%VAR:~10,5% можно извлекать подстроки, в данном случае с величиной смещения "10" и длиной "5".
Так вот, это самое смещение можно задать случайным образом. В примере ниже будет показано как в символьном массиве CHAR будут определены символы для генерирования случайного пароля длиной в 8 символов.
Переменная "I" - определяет длину выводимых символов;
Переменная "N" - количество элементов списка CHAR.
Bash
1
2
3
4
5
6
7
8
9
10
@echo off
set I=8
set N=65
set CHAR=0123456789$#_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWQYZ
:LOOP
set /a R=%N%*%random%/32768
set PW=!CHAR:~%R%,1!%PW%
set /a I-=1
if %I% GTR 0 goto LOOP
echo %PW%
2. Генерирование 26-значного шестнадцатеричного кода

Случайные числа можно использовать и в качестве указателей на элементы (от 1 до N) заранее определенного списка.
Что здесь и выполнено в цикле for. Пример может пригодиться при 128-разрядном шифровании WEP в беспроводных сетях:
Bash
1
2
3
4
5
6
7
8
9
10
@echo off
set I=26
set N=16
set CHAR=0 1 2 3 4 5 6 7 8 9 A B C D E F
:LOOP
set /a R=1+%N%*%random%/32768
for /f "tokens=%R%" %%q in ("%CHAR%") do (set Hex=%%q%Hex%)
Set /a I-=1
If %I% GTR 0 goto LOOP
echo %Hex%
3. Увеличение области значений

Переменная %RANDOM% выводит значение в области от 0 до 32767, это значение можно увеличить, умножив на нее же:
Bash
1
set /a rnd=%random%*%random%
Автор примеров - kiber_punk
0
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
11.02.2013, 17:34  [ТС] 25
Таймер
(с отображением миллисекунд)

Кликните здесь для просмотра всего текста
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
@echo off
Setlocal EnableDelayedExpansion
 
Call :Timer Start
pause
Call :Timer End
 
pause>nul
goto :eof
 
:Timer
  if "%~1"=="Start" (
    Set StartTime=%time%
    Echo Время запуска    !StartTime!
  ) else (
    Set EndTime=%time%
    Echo Время завершения !EndTime!
    Call :TimeElapsed "%StartTime%" "!EndTime!" ret
    Echo Прошло                  !ret! c.
  )
exit /B
 
:TimeElapsed %1-StartTime %2-EndTime %3-var_result
  Call :TimeToMSec "%~1" TimeS_ms
  Call :TimeToMSec "%~2" TimeE_ms
  Set /A diff=TimeE_ms-TimeS_ms
  Set /A diffSS=diff/100
  Set /A diffms=%diff% %% 100
  if "%diffms:~1%"=="" Set diffms=0%diffms%
  Set %3=%diffSS%,%diffms%
Exit /B
 
:TimeToMSec %1-Time 2-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


Такой таймер увидел у einstein1969

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
setlocal EnableDelayedExpansion
 
set t0=!time!
 
pause
 
set t1=!time!
call :difftime
 
pause & exit /B
 
:difftime
  for /F "tokens=1-8 delims=:.," %%a in ("!t0: =0!:!t1: =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"
  echo !a! cs
goto :eof


Производные таймера einstein1969 от меня

Вывод в формате HH:MM:SS

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 EnableDelayedExpansion
 
set t0=!time!
::set t0=23:49:15,00
pause
set t1=!time!
::set t1= 7:41:23,71
 
echo %t0%
echo %t1%
 
call :difftime
 
pause & exit /B
 
:difftime
  for /F "tokens=1-8 delims=:.," %%a in ("%t0: =0%:%t1: =0%") do set /a "ss=(((1%%e-1%%a)*60)+1%%f-1%%b)*60+1%%g-1%%c, ss+=(ss>>31) & 86400, hh=ss/3600, mm=ss/60-hh*60, ss%%=60, hh+=100, mm+=100, ss+=100"
  echo %hh:~-2%:%mm:~-2%:%ss:~-2%
goto :eof


Добавление минут ко времени

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Echo Off
SetLocal EnableExtensions
 
::Set mt=%Time%
:: Для теста:
Set mt=00:05
 
:: операция = -10 мин.
set dt=-10
 
for /f "tokens=1-2 delims=:" %%a in ("%mt: =0%") do set /a "t=(1%%a-100)*60+(1%%b-100)+(dt %% 1440)", "t+=(t>>31) & 1440", "hh=(t/60 %% 24)+100", "mm=(t %% 60)+100"
echo %hh:~-2%:%mm:~-2%
 
pause


Добавлено через 3 минуты
Определение дня недели
(а также № месяца, квартала, Поры года, № месяца поры года, № календарной недели (от начала года))
Взято с OSZONE.

1) День недели, название и № месяца от начала года, квартала, кол-во часов, минут, секунд
Кликните здесь для просмотра всего текста


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 EnableDelayedExpansion
 
For /F "Tokens=1* Delims==" %%i In ('WMIC Path Win32_LocalTime Get /Value ^| Find "="') Do (
  Set V=%%j
  Set $%%i=!V:~0,-1!
)
If "%$DayOfWeek%"=="0" Set $DayOfWeek=7
 
For /F "Tokens=%$Month%" %%i In ("Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь") Do Set $MonthName=%%i
For /F "Tokens=%$DayOfWeek%" %%i In ("Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье") Do Set $DayOfWeekName=%%i
 
Echo --------------------------------------
Echo День          : %$Day%
Echo Месяц         : %$MonthName% (%$Month%-й месяц года)
Echo Год           : %$Year%
Echo --------------------------------------
Echo День недели   : %$DayOfWeekName% (%$DayOfWeek%-й день недели)
Echo Квартал       : %$Quarter%
Echo --------------------------------------
Echo Часов         : %$Hour%
Echo Минут         : %$Minute%
Echo Секунд        : %$Second%
Echo --------------------------------------
Pause>nul
Каталог простых примеров решенных задач BAT/CMD, с чего начать (■■■ основная тема ■■■)


2) Название месяца, пора года, № месяца поры года.
Кликните здесь для просмотра всего текста

Bash
1
2
3
4
5
6
7
8
9
10
11
@Echo Off
 
For /F "Tokens=1,2 Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Month^,Year') Do If Not "%%j"=="" Set $Month=%%i&Set $Year=%%j
For /F "Tokens=%$Month% Delims=," %%i In ("Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь") Do Set $MonthName=%%i
 
Set /A $Season = ($Month-$Month/12*12)/3+1
Set /A $MonthInSeason = $Month-$Month/12*12-(%$Season%-1)*3+1
For /F "Tokens=%$Season% Delims=," %%i In ("Зимы,Весны,Лета,Осени") Do Set $SeasonGenitive=%%i
 
Echo На дворе %$MonthName% - %$MonthInSeason%-й месяц %$SeasonGenitive%
pause>nul
Название: Date2.png
Просмотров: 10558

Размер: 1.5 Кб


3) название дня недели, номер календарной недели.
Кликните здесь для просмотра всего текста
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
::Здесь задаем дату
set dd=11
set mm=02
set yy=2013
 
call :DateToWeek %yy% %mm% %dd% yn cw dw
 
for /f "tokens=%dw%" %%i in ("понедельник вторник среда четверг пятница суббота воскресенье") Do Set DayOfWeek=%%i
echo %DayOfWeek%
echo Календарная неделя (номер недели от начала года): %cw%
pause>nul
exit /b
 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
:DateToWeek %yy% %mm% %dd% yn cw dw
::
:: By:   Ritchie Lawrence, Updated 2002-11-20. Version 1.1
::
:: Func: Returns an ISO 8601 Week date from a calendar date.
::       For NT4/2000/XP/2003.
:: 
:: Args: %1 year component to be converted, 2 or 4 digits (by val)
::       %2 month component to be converted, leading zero ok (by val)
::       %3 day of month to be converted, leading zero ok (by val)
::       %4 var to receive year, 4 digits (by ref)
::       %5 var to receive calendar week, 2 digits, 01 to 53 (by ref)
::       %6 var to receive day of week, 1 digit, 1 to 7 (by ref)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
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,Jd=153*m+2
set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
if %cw% LSS 10 set cw=0%cw%
endlocal&set %4=%yn%&set %5=%cw%&set %6=%wd%&goto :EOF
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
6
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
11.02.2013, 23:25  [ТС] 26
Операции арифметического сравнения

EQU - равно, идентично оператору ==
NEQ - не равно
LSS - меньше, чем
LEQ - меньше или равно
GTR - больше, чем
GEQ - больше или равно

Например:
Bash
1
2
set /a number=10
if %number% GTR 9 Echo Число %number% больше 9
0
94 / 94 / 4
Регистрация: 25.06.2012
Сообщений: 278
12.02.2013, 00:45 27
Прикольная фишка!!! Вывод текста без переноса на новую строку Респект авторам.

Bash
1
2
3
4
5
6
@echo off
for /l %%i in (1,1,10) do (
    <nul set /p strTemp=%%i
    ping n 1 127.0.0.1 >nul
    <nul set /p strTemp=[пять символов backspace]
)
Символы backspace выводил с помощью редактора SciTE Версия 3.2.4 .98Ru и комбинации alt+08.
Через Far, как описано в теме: ctrl+q and backspace
Этот же батник прикрепил для демонстрации, т.к. символы backspace на форум не выводятся.
Миниатюры
Каталог простых примеров решенных задач BAT/CMD, с чего начать (■■■ основная тема ■■■)  
Вложения
Тип файла: zip without_crlf.zip (223 байт, 97 просмотров)
0
Модератор
Эксперт JS
5238 / 2111 / 416
Регистрация: 06.01.2013
Сообщений: 4,843
31.05.2013, 19:58 28
Чтение нескольких первых строк из файла.

Пример для первых двух строк:
Bash
1
2
3
4
5
@echo off
(echo.11&echo.12)>file.txt
(set /p x=&set /p y=)<file.txt
echo.%x%&echo.%y%
pasue>nul
Цитата Сообщение от ql_didar Посмотреть сообщение
А что делать если 100 строка нужна, или 300-ая?
Bash
1
2
3
(
for /L %%A IN (1,1,300) DO (set /p second=)
)<q.txt
3
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
08.06.2013, 21:06  [ТС] 29
Функция получения вчерашней даты в национальном формате, установленном в системных настройках

Просто написана. Спасибо menofdrusk. Нашел в теме: Удаление файлов по маске по дате создания
Исправил ошибку 8-ричного представления числа (пару последних строк).
И упростил функцию определения высокосного года.
Данные о формате представления даты считываются из реестра.

Кликните здесь для просмотра всего текста
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
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
Call :GetDate
echo Сегодня: День - %day% Месяц - %Month% Год - %Year%
Call :GetYesterday
echo Вчера: %Yesterday%
 
:: Рекурсивное удаление с диска C:\ всех фалов *.jpg, последняя дата модификации которых = вчера.
::Set ROOT=*.jpg
::For /R C:\ %%i In (%ROOT%) Do For /F "Tokens=1" %%j In ("%%~ti") Do If "%%j"=="%Yesterday%" DEL /F/Q "%%i"
pause
Exit
 
Rem Восстановление вчерашней даты
:GetYesterday
 Call :GetMnthDays
 Set /A Day-=1
 IF %Day% EQU 0 (
    Set /A MNDF=%Year%*12+%Month%-2
    Set /A Year=!MNDF!/12
    Set /A Month=!MNDF!-!Year!*12+1
 
    Call :GetMnthDays
    Set /A Day=!MnthDays!
 )
 Set Month=0%Month%&Set Day=0%Day%
 Set Month=%Month:~-2%&Set Day=%Day:~-2%
 
 If %iDate%==0 Set Yesterday=%Month%%sDate%%Day%%sDate%%Year%
 If %iDate%==1 Set Yesterday=%Day%%sDate%%Month%%sDate%%Year%
 If %iDate%==2 Set Yesterday=%Year%%sDate%%Month%%sDate%%Day%
GoTo :EOF
 
Rem Число дней в заданном месяце
:GetMnthDays
 Call :IsYearVisok
 For /F "Tokens=%Month%" %%i IN ("31 28 31 30 31 30 31 31 30 31 30 31") Do Set MnthDays=%%i
 If %Month% EQU 2 Set /A MnthDays += %IsVisok%
GoTo :EOF
 
Rem Проверка года на высокосность
:IsYearVisok
 Set /A M=%Year% %% 4
 If 0 EQU %M% (Set IsVisok=1) else (Set IsVisok=0)
GoTo :EOF
 
Rem Чтение текущей даты в переменные окружения
:GetDate
 For /F "Tokens=1,3" %%i IN ('REG QUERY "HKCU\Control Panel\International" /s^|FindStr /C:"iDate" /C:"sDate"') DO Set %%i=%%j
 For /F "Tokens=1-4* Delims=%sDate% " %%A IN ("%Date%") Do (
    If %iDate% EQU 0 Set Year=%%C&Set Month=%%A&Set Day=%%B
    If %iDate% EQU 1 Set Year=%%C&Set Month=%%B&Set Day=%%A
    If %iDate% EQU 2 Set Year=%%A&Set Month=%%B&Set Day=%%C
 )
 if "%Day:~0,1%"=="0" set Day=%Day:~1,1%
 if "%Month:~0,1%"=="0" set Month=%Month:~1,1%
GoTo :EOF


Еще одна от evgeni666:

Кликните здесь для просмотра всего текста
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
@echo off 
 for /f "skip=2 tokens=2*" %%i in ('reg QUERY "HKCU\Control Panel\International" /v sDate') do set sdate=%%j 
 for /f "delims=%sdate% tokens=1,2,3" %%i in ("%DATE%") do call :getpackage %%i %%j %%k 
  
 :: проверочка 
 echo %year% 
 echo %month% 
 echo %day% 
 echo %package% 
  
  
 :: тут можно поместить необходимые нам команды 
  
 goto :EOF 
  
 :getpackage 
 set day=%1 
 set month=%2 
 set /a year=%3 
 set lastdays="31 28 31 30 31 30 31 31 30 31 30 31" 
 if %day% leq 9 set /a day=%day:~-1% 
 if %month% leq 9 set /a month=%month:~-1% 
 set /a day-=1 
 if "%day%"=="0" set /a month-=1 
 if "%month%"=="0" set /a month=12,year-=1 
 set /a isleap="(year%%4)&((year%%100)|(year%%400))" 
 if "%isleap%"=="0" set lastdays=%lastdays:28=29% 
 if "%day%"=="0" for /f "tokens=%month%" %%i in (%lastdays%) do set day=%%i 
 if %day% leq 9 set day=0%day% 
 if %month% leq 9 set month=0%month% 
 set package=%year%-%month%-%day% 
 goto :EOF


Функция для добавления/вычитания дней к/из даты

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

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
:FromDate [Дата] [действие (+-) Число дней] [Переменная для хранения результата]
  :: Функция работы с датами
  setLocal
  set now=%~1
  set /a yyyy=%now:~-4%
  set /a mm=1%now:~3,2%-100
  set /a dd=1%now:~,2%-100
  set /a JD=%~2+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
  set /a L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
  set /a L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
  set /a J=J+2-12*L,I=100*(N-49)+I+L
  set /a yyyy=I,mm=100+J,dd=100+K
  EndLocal& set "%~3=%dd:~-2%.%mm:~-2%.%yyyy%"
exit /b
2
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
26.06.2013, 06:54  [ТС] 30
Удаление из строки всех символов, кроме цифр.
Работает без DelayedExpansion.

Bash
1
2
3
4
5
6
7
8
9
10
::на вход строку, на выходе только числа
:FilterNumbers
::%1 - Строка
::%2 - Переменная для хранения числа
  set "_var=%~1"& Set FilterNum=
  :fcount--
  echo.%_var:~0,1%|>nul findstr /R "[0-9]"&& if not errorlevel 1 Set FilterNum=%FilterNum%%_var:~0,1%
  set "_var=%_var:~1%"
  if not defined _var (Set "%~2=%FilterNum%"& exit /b) else (goto fcount--)
Exit /B
Использование:
Bash
1
2
3
4
5
@echo off
SetLocal EnableExtensions
Call :FilterNumbers "q1w2e3r45ty" Numbers
echo %Numbers%
pause
Для обратного фильтра: удаления из строки всех цифр используйте в строке 7 такую регулярку:
"[^0-9]"
3
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
06.07.2013, 15:22  [ТС] 31
Делаем паузу в командном файле стандартными средствами Windows
(Для NT систем старше NT 4.0 - 2000, XP, 2003, Vista...)
От Smitis

Чаще всего для этих целей предлагают команду ping. Лично мне совершенно не нравится этот способ. Задержка, даваемая командой ping очень неточна. Более того, она очень зависит от настроек сети. У меня был случай, когда из-за файрвола пауза получалась какая угодно, но только не та, что была задана в команде.

Есть вариант с использованием утилит sleep.exe, choice.com, choice.exe. Их можно взять из Resource Kit, а choice.com из Win9x. Но ни одна из них не входит в "стандартную поставку" XP и 2000.

Предлагаемый мной способ - использование WSH, в частности jscript

Вариант 1. Файл sleep.js

Bash
if(isFinite(WScript.Arguments(0))) WScript.Sleep(WScript.Arguments(0))
Вызов:
Bash
sleep.js ms
или
Bash
cscript //nologo sleep.js ms
Где:
ms - пауза в миллисекундах
Второй вариант вызова предпочтительнее, т.к. система может быть настроена на вызов wscript вместо cscript и паузы не получится.

Вариант 2. Делаем гибридный файл - основной файл cmd со вставкой jscript
Минимальный вариант:

Bash
1
2
3
4
5
6
@set @x=0 /* 
@echo off 
 
cscript //nologo /e:jscript "%~f0" 10000 
 
goto:eof */ if(isFinite(WScript.Arguments(0))) WScript.Sleep(WScript.Arguments(0))
То же с коментариями:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@set @x=0 /* Это строка должна быть первой. Далее идёт основной текст командного файла 
@echo off 
 
:: 
:: Здесь что-то делаем до паузы 
:: 
 
:: Здесь делаем паузу, для примера, 10 секунд (10000 миллисекунд) 
cscript //nologo /e:jscript "%~f0" 10000 
 
:: 
:: Здесь продолжение текста командного файла 
:: В нём опять могут быть паузы, например, пол секунды 
cscript //nologo /e:jscript "%~f0" 500 
:: 
:: И ещё что-нибудь 
:: 
 
:: Следующая строка должна быть последней 
goto:eof */ if(isFinite(WScript.Arguments(0))) WScript.Sleep(WScript.Arguments(0))
4
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
17.07.2013, 21:03  [ТС] 32
Получаем расположение рабочего стола и других NameSpace через реестр

Bash
1
2
3
@echo off
for /f "tokens=2*" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop') do set folder=%%~b
echo %folder%
Миниатюры
Каталог простых примеров решенных задач BAT/CMD, с чего начать (■■■ основная тема ■■■)  
2
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
13.10.2013, 18:23  [ТС] 33
Функция безопасного парсинга даты на составляющие вне зависимости от настроек региональных стандартов

На примере получения текущей даты в формате DD.MM.YYYY

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
@echo off
SetLocal EnableExtensions
call :GetDateToday DateToday
pause& Exit /B
 
:GetDateToday [Переменная для хранения текущей даты]
  :: Получает текущую дату в формате DD.MM.YYYY независимо от настроек региональных стандартов
  call :ParseDateSafe "%Date%" DayToday MonthToday YearToday
  set "%~1=%DayToday%.%MonthToday%.%YearToday%"
  ;;; echo Сегодня 
  ;;; echo День - %DayToday%
  ;;; echo Месяц - %MonthToday%
  ;;; echo Год - %YearToday%
Exit /B
 
:ParseDateSafe [Дата] [Переменная - День] [Переменная - Месяц] [Переменная - Год]
  :: Функция безопасного парсинга даты на составляющие вне зависимости от настроек региональных стандартов
  if not Defined iDate For /F "Tokens=1,3" %%i IN ('REG QUERY "HKCU\Control Panel\International" /s^|FindStr /C:"iDate" /C:"sDate"') DO Set "%%i=%%j"
  set "DateToParse=%~1"
  For /F "Tokens=2" %%? IN ("%~1") Do if not "%%?"=="" set "DateToParse=%%?"
  For /F "Tokens=1-4* Delims=%sDate% " %%A IN ("%DateToParse%") Do (
    If "%iDate%"=="0" Set "Year=%%C"& Set "Month=%%A"& Set "Day=%%B"
    If "%iDate%"=="1" Set "Year=%%C"& Set "Month=%%B"& Set "Day=%%A"
    If "%iDate%"=="2" Set "Year=%%A"& Set "Month=%%B"& Set "Day=%%C"
  )
  ::if "%Day:~0,1%"=="0" set "Day=%Day:~1,1%"
  ::if "%Month:~0,1%"=="0" set "Month=%Month:~1,1%"
  if "%Day:~1,1%"=="" set "Day=0%Day%"
  if "%Month:~1,1%"=="" set "Month=0%Month%"
  set "%~2=%Day%"& set "%~3=%Month%"& set "%~4=%Year%"
Exit /B
1
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
22.03.2014, 19:37  [ТС] 34
Скрипт удаления всех JPG-файлов, кроме N последних (по имени файла) каждые 30 секунд

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
:: Отслеживаемая папка
set Folder=c:\temp
 
:: Расширение имени
set ext=jpg
 
:: Кол-во файлов, которые не трогаем
set permanent=3
 
:: Интервал отслеживания (в сек.)
set interval=30
 
set /a interval+=1
:begin
set Count=0
For /F "delims=" %%a in ('dir /b /a-d /O-N "%Folder%\*.%ext%"') do set /a Count+=1& if !count! GTR %permanent% del /F /A "%Folder%\%%a"
>NUL ping 127.1 -n %interval%
goto begin
1
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
12.04.2014, 17:50  [ТС] 35
Поиск позиции подстроки в строке

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
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
set Text=Some_Text__For Example
set SubString=___
 
call :Pos "%Text%" "%SubString%"
echo Текст: %Text%
echo Подстрока: %SubString%
echo в позиции: %errorlevel%
echo.
pause
exit /B
 
:Pos [Text] [SubString] [/i - optional] // Require DelayedExpansion
  call :Lenght "%~1" & set _TextLen=!Errorlevel!
  call :Lenght "%~2" & set _SubLen=!Errorlevel!
  set Pos_var=%~1& set _pos=0
  :pos_i
  if %~3 "!Pos_var:~%_pos%,%_SubLen%!"=="%~2" Exit /B %_pos%
  set /a _pos+=1
  if %_pos%==%_TextLen% Exit /B -1
  goto pos_i
Exit /B
 
:Lenght [Text]
  set Lenght_var=%~1& set _count=0
  :count_d
  set Lenght_var=%Lenght_var:~1%& set /a _count+=1
  if not defined Lenght_var (Exit /B %_count%) else (goto count_d)
Exit /B
2
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
01.05.2014, 21:15  [ТС] 36
Урезание строки до последнего указанного разделителя (с конца строки)

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@echo off
SetLocal EnableExtensions
set a=123_456_789
call :CutUntilLastChar "%a%" "_" ret
echo %ret%
:: получим 123_456
 
pause
Exit /B
 
:CutUntilLastChar [_in_string] [_in_last char delimiter] [_out_variable that receive a bufer]
  :: урезает строку до указанного разделителя, считая от конца строки
  :: если разделитель не найден, возвращается вся строка
  set "_var=%~1"
  :_CutUntilLastChar_loop
  if "%_var:~-1%"=="%~2" (if "%_var:~,-1%" neq "" set "%~3=%_var:~,-1%"& exit /B)
  set "_var=%_var:~,-1%"
  if "%_var%" neq "" (goto _CutUntilLastChar_loop) else (set "%~3=%~1")
Exit /B
3
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
20.11.2014, 01:48  [ТС] 37
Функция, которая проверяет, пуста ли папка

Коды возврата:
0 - пустая
1 - есть файлы
2 - есть каталоги
3 - есть каталоги и файлы

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
SetLocal EnableExtensions
call :IsEmptyFolder "c:\test"
echo %errorlevel%
pause
goto :eof
 
:IsEmptyFolder
  :: Функция, которая проверяет, пуста ли папка
  :: %1-вх.параметр - проверяемая папка
  :: errorlevel 0 - пустая, 1 - есть файлы, 2 - есть каталоги, 3 - есть каталоги и файлы
  set EF_Flag=0
  set EF_Cur_Flag=0
  for /f "delims=" %%A in ('dir /B /A:D "%~1\*"') do set EF_Cur_Flag=2
  set /A EF_Flag=%EF_Flag% "|" %EF_Cur_Flag%
  for /f "delims=" %%A in ('dir /B /A:-D "%~1\*"') do set EF_Cur_Flag=1
  set /A EF_Flag=%EF_Flag% "|" %EF_Cur_Flag%
Exit /B %EF_Flag%
4
1748 / 353 / 41
Регистрация: 15.10.2012
Сообщений: 550
20.11.2014, 13:06 38
Предложение для темы Каталог простых примеров решенных задач BAT/CMD, с чего начать (■■■ основная тема ■■■)

Что-бы избежать случайного использования в подпрограммах уже задействованых переменных, начинать и заканчивать подпрограммы setlocal и endlocal
Например для этой
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
:IsEmptyFolder
  :: Функция, которая проверяет, пуста ли папка
  :: %1-вх.параметр - проверяемая папка
  :: errorlevel 0 - пустая, 1 - есть файлы, 2 - есть каталоги, 3 - есть каталоги и файлы
  setlocal
  set EF_Flag=0
  set EF_Cur_Flag=0
  for /f "delims=" %%A in ('dir /B /A:D "%~1\*"') do set EF_Cur_Flag=2
  set /A EF_Flag=%EF_Flag% "|" %EF_Cur_Flag%
  for /f "delims=" %%A in ('dir /B /A:-D "%~1\*"') do set EF_Cur_Flag=1
  set /A EF_Flag=%EF_Flag% "|" %EF_Cur_Flag%
  endlocal & exit /b %EF_Flag%
1
Эксперт WindowsАвтор FAQ
18014 / 7715 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
30.04.2015, 21:35  [ТС] 39
Получение N-й строки с конца файла.
1
23 / 22 / 4
Регистрация: 25.06.2018
Сообщений: 169
28.07.2018, 22:40 40
Команда RANDOM - в заданном диапазоне.

Не знаю, может этот метод известен, но я такое увидел впервые и на форуме подобного не нашел.

Мальчик Никита, 11 годиков, решая задачку применил с "ошибкой" команду Random. Однако, программа работала.
Проверил отдельно это "ошибочное" написание команды. Точно работает!

Случайное из 10 чисел, от 0 до 9
set /a X=%random% %%10

Случайное из 20 чисел, от 1 до 20
set /a X=%random% %%20+1

Случайное из 30 чисел, от 100 до 130
set /a X=%random% %%30+100

ну и т.д. с учетом ваших арифметических фантазий ...
0
28.07.2018, 22:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2018, 22:40
Помогаю со студенческими работами здесь

Запустить CMD окно указав текущий каталог из Bat
Добрый день. Подскажите, пожалуйста. Как установить текущий каталог в окне CMD? Я ожидал что...

Как скопировать файл в системный каталог посредством cmd/bat
Доброго всем времени суток. Наберитесь минутку терпения. Хочу передать всю интригу... Как же тут...

Количество правильно решённых примеров
Напишите программу для решения следующей задачи. На контрольной работе по алгебре ученикам 9 класса...

Проверить правильность решённых примеров
Нужно разобраться какое решение из двух верное или верно оба?

Подсчет правильно решенных примеров
Перевод кода с Pyton на C++ import random the_first_digit = the_second_digit = ...

Подсчитать количество правильно и неправильно решенных примеров
Помогите найти ошибки в программе. Программа должна подсчитывать правильно и неправильно решенные...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru