Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
23.01.2013, 20:55
Студворк — интернет-сервис помощи студентам
Капитальное исследование strlen(); - несколько способов с таймингами.

Не по теме:

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

1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.01.2013, 20:55
Ответы с готовыми решениями:

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

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

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

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

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
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
31.01.2013, 11:24
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
 Аватар для Badger
95 / 95 / 4
Регистрация: 25.06.2012
Сообщений: 278
10.02.2013, 01:59
Порыскав в инете нашел интересные вещи с использованием %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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.02.2013, 17:34  [ТС]
Таймер
(с отображением миллисекунд)

Кликните здесь для просмотра всего текста
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


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
Просмотров: 10638

Размер: 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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.02.2013, 23:25  [ТС]
Операции арифметического сравнения

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

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

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
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
31.05.2013, 19:58
Чтение нескольких первых строк из файла.

Пример для первых двух строк:
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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
08.06.2013, 21:06  [ТС]
Функция получения вчерашней даты в национальном формате, установленном в системных настройках

Просто написана. Спасибо 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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
26.06.2013, 06:54  [ТС]
Удаление из строки всех символов, кроме цифр.
Работает без 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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
06.07.2013, 15:22  [ТС]
Делаем паузу в командном файле стандартными средствами 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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.07.2013, 21:03  [ТС]
Получаем расположение рабочего стола и других 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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
13.10.2013, 18:23  [ТС]
Функция безопасного парсинга даты на составляющие вне зависимости от настроек региональных стандартов

На примере получения текущей даты в формате 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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.03.2014, 19:37  [ТС]
Скрипт удаления всех 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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.04.2014, 17:50  [ТС]
Поиск позиции подстроки в строке

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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
01.05.2014, 21:15  [ТС]
Урезание строки до последнего указанного разделителя (с конца строки)

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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
20.11.2014, 01:48  [ТС]
Функция, которая проверяет, пуста ли папка

Коды возврата:
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
Предложение для темы Каталог простых примеров решенных задач 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
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
30.04.2015, 21:35  [ТС]
Получение N-й строки с конца файла.
1
23 / 22 / 4
Регистрация: 25.06.2018
Сообщений: 169
28.07.2018, 22: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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.07.2018, 22:40

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru