С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/1554: Рейтинг темы: голосов - 1554, средняя оценка - 4.50
Charles Kludge
Клюг
7645 / 3160 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
23.01.2013, 20:55 21
Капитальное исследование strlen(); - несколько способов с таймингами.

Не по теме:

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

1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2013, 20:55
Ответы с готовыми решениями:

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

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

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

Как сделать "Панель задач" в две строки через реестр или скриптом bat/cmd?
Как сделать Панель задач в две строки... интересует вариант через реестр,...

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

39
Smitis
1629 / 338 / 40
Регистрация: 15.10.2012
Сообщений: 530
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
Charles Kludge
Клюг
7645 / 3160 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
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
Badger
91 / 91 / 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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
Просмотров: 9269

Размер: 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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
Badger
91 / 91 / 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 на форум не выводятся.
0
Миниатюры
Каталог простых примеров решенных задач BAT/CMD, с чего начать (■■■ основная тема ■■■)  
Вложения
Тип файла: zip without_crlf.zip (223 байт, 58 просмотров)
Eva Rosalene
T for Trans-
4051 / 1590 / 303
Регистрация: 06.01.2013
Сообщений: 4,182
Завершенные тесты: 2
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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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%
2
Миниатюры
Каталог простых примеров решенных задач BAT/CMD, с чего начать (■■■ основная тема ■■■)  
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
Smitis
1629 / 338 / 40
Регистрация: 15.10.2012
Сообщений: 530
20.11.2014, 13:06 38
Предложение для темы Каталог простых примеров решенных задач BAT/CMD, с чего начать (■■■ основная тема ■■■)

Что-бы избежать случайного использования в подпрограммах уже задействованых переменных, начинать и заканчивать подпрограммы setlocal и endlocal
Например для этой
Bash
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
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 16
30.04.2015, 21:35  [ТС] 39
Получение N-й строки с конца файла.
1
Серый74
5 / 5 / 0
Регистрация: 25.06.2018
Сообщений: 17
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2018, 22:40

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

Примеры решенных задач
Вот решил выложить программы с лабораторных работ: 1) Сгенерировать...

Сборник решенных задач
Здравствуйте! Вот тут меня посетила идея.Наверно не впервые я её озвучу, но всё...


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

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

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