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

Batch (CMD/BAT)

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Dragokas
Эксперт WindowsАвтор FAQ
16613 / 6998 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
17.01.2013, 22:31  [ТС] #16
Сравнение без учета регистра букв
Для сравнения значений переменных между собой без учета регистра,
- добавим ключ /i к команде if

Bash
1
2
3
set a=test
set b=TEST
if /i %a%==%b% echo OK
Подпрограмма изменения регистра текста

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
@echo off
Setlocal EnableDelayedExpansion
 
set Utext= Up case text--~@#*()_+-
Call :Case Utext U
echo %Utext%
 
set Ltext=lAW CASE TEXT--~@#*()_+-
Call :Case Ltext L
echo %Ltext%
 
pause
Goto :eof
 
:Case %1-var %2.option-L-or-U
if not Defined CaseA Call :FillSlovar
set word=!%~1!
if not Defined word Exit /B
set tempvar=
set /A n=-1
:newsymbol
set /A n+=1
set "symb=!word:~%n%,1!"
if "%symb%"=="" (Set "%~1=%tempvar%"& Exit /B)
if "!case%~2%symb%!"=="" (
  set "tempvar=%tempvar%%symb%"
) else (
  set "tempvar=%tempvar%!case%~2%symb%!"
)
goto :newsymbol
 
:FillSlovar
Set AlphabetL=abcdefghigklmnopqrstuvwxyz
Set AlphabetU=ABCDEFGHIJKLMNOPQRSTUVWXYZ
For /L %%C in (0,1,25) do (
  set caseU!AlphabetL:~%%C,1!=!AlphabetU:~%%C,1!
  set caseL!AlphabetU:~%%C,1!=!AlphabetL:~%%C,1!
)
Exit /B
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2013, 22:31
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Каталог простых примеров решенных задач BAT/CMD, с чего начать (■■■ основная тема ■■■) (CMD/BAT):

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

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

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

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

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

Сборник решенных задач - Алгоритмы
Здравствуйте! Вот тут меня посетила идея.Наверно не впервые я её озвучу, но всё же.Почему бы нам не завести отдельную тему в этой части...

38
Dragokas
Эксперт WindowsАвтор FAQ
16613 / 6998 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
18.01.2013, 00:46  [ТС] #17
Подпрограмма вычисления степени числа

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Echo Off
Setlocal EnableDelayedExpansion
Set /A num=3
::Вычисляем 3 в 4-й степени
Call :Stepping num 4
Echo %num%
pause
exit /B
 
:Stepping %1 - Переменная с числом %2 - Степень
set /A s=%2
if %s%==0 (Set /A %1=1& exit /b)
if %s%==1 exit /b
set step=%3
if not defined step set step=!%1!
set /A s-=1
set /A %1*=%step%
Call :Stepping %1 %s% %step%
exit /b
2
Eva Rosalene
Male-to-Female
4049 / 1586 / 242
Регистрация: 06.01.2013
Сообщений: 4,176
Завершенные тесты: 1
22.01.2013, 18:43 #18
Проверка на содержание подстроки в строке.
Код:
Bash
1
2
3
4
5
6
7
8
:isin
set stroka=%~1
set podstroka=%~2
set f_=0
if "%stroka%"=="" (echo.Empty string & exit /b)
if "%podstroka%"=="" (echo.Empty 2nd string & exit /b)
echo.%stroka%|find "%podstroka%">nul && set f_=1
exit /b

__________
Синтаксис:
Bash
1
call :isin строка подстрока
Результат сохраняется в переменную "f_", если найдено - 1, если нет - 0.
В случае отсутствия строки или подстроки выводит соответствующее сообщение.

Добавлено через 21 минуту
ПыСы. Работает долго, поэтому не для использования внутри цикла

Добавлено через 2 минуты
А может просто ноут тормозит о_0
2
Eva Rosalene
Male-to-Female
4049 / 1586 / 242
Регистрация: 06.01.2013
Сообщений: 4,176
Завершенные тесты: 1
23.01.2013, 19:12 #19
Цитата Сообщение от Dragokas Посмотреть сообщение
Клас
А что это? Виртуальная машина с х64?

Определение длины строки (более скорый вариант)

Требования

Bash
1
setlocal enabledelayedexpansion
КОД

Bash
1
2
3
4
5
6
7
:strlength
set string_q12e=%~1
set counter_0121=0
:again_r0067
if "!string_q12e:~%counter_0121%,1!"=="" (set strlength_=!counter_0121!&exit /b)
set /a counter_0121=!counter_0121!+1
goto :again_r0067
Синтаксис

Bash
1
call :strlength <Строка>
Значение возвращается в переменную strlength_

Используемые имена переменных и меток

Во избежание некорректной работы вашей программы нельзя использовать переменные counter_0121 и string_q12e, а также метки :strlength и :again_r0067

Добавлено через 55 минут
P.S. Пока писал - заметил: Проценты раскрываются раньше восклицательных знаков!
1
Dragokas
Эксперт WindowsАвтор FAQ
16613 / 6998 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
23.01.2013, 19:28  [ТС] #20
Цитата Сообщение от FraidZZ Посмотреть сообщение
А что это? Виртуальная машина с х64?
да нет, обычная Win7 x64. Просто запускал с AkelPad-a. который в свою очередь запущен с x64-редакции Total Commander. Вот наверно и подхватило другую среду. Хотя SysWOW64 - это вообще 32-разрядная папка. Странно, на рабочем компе это не воспроизводится.

Цитата Сообщение от FraidZZ Посмотреть сообщение
P.S. Пока писал - заметил: Проценты раскрываются раньше восклицательных знаков!
Да есть такое. Поэтому, если нужно получить значение переменной, имя которой частично или целиком состоит из значения другой переменной, такой порядок и используем:
Bash
1
2
3
4
setlocal enabledelayedexpansion
set num=1
set param1=test
set value=!param%num%!
или так:
Bash
1
2
3
set num=1
set param1=test
call set value=%%param%num%%%
Цитата Сообщение от FraidZZ Посмотреть сообщение
Определение длины строки
Писал такое уже, но на рекурсии: Каталог простых примеров решенных задач BAT/CMD, с чего начать (■■■ основная тема ■■■)

Цитата Сообщение от FraidZZ Посмотреть сообщение
нельзя использовать переменные counter_0121 и string_q12e
Используя Setlocal в подпрограмме и вот такой трюк, можешь избавится от этого недостатка:
Пример:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
set param=1
call :me "variable"
echo Value from sub=%variable%
::Проверяем изменилось ли значение переменной
echo Old value=%param% is saved !
pause
goto :eof
 
:me
setlocal
::Используем точно такое же имя переменной
set param=123
endlocal& set %~1=%param%
exit /b
2
Charles Kludge
Клюг
7641 / 3156 / 366
Регистрация: 03.05.2011
Сообщений: 8,382
23.01.2013, 20:55 #21
Капитальное исследование strlen(); - несколько способов с таймингами.

Не по теме:

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

1
Smitis
1628 / 337 / 39
Регистрация: 15.10.2012
Сообщений: 529
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
Клюг
7641 / 3156 / 366
Регистрация: 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
16613 / 6998 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 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
Просмотров: 9186

Размер: 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
16613 / 6998 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 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 байт, 56 просмотров)
Eva Rosalene
Male-to-Female
4049 / 1586 / 242
Регистрация: 06.01.2013
Сообщений: 4,176
Завершенные тесты: 1
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
16613 / 6998 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 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
16613 / 6998 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 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
26.06.2013, 06:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2013, 06:54
Привет! Вот еще темы с ответами:

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

Большая коллекция решенных задач - C++
Обработка строк 1. Вывести в алфавитном порядке все буквы, которые входят в текст по одному разу 2. Является ли введенная строка...

Очередная тема "С чего начать?" - Графика и игры
Привет всем, так сложилась моя судьба, что учился я на инженера испытателя, точнее доучиваюсь, сейчас пишу диплом, работаю и хочу работать...

Необходимо 5 решенных задач на основные алгоритмы - Turbo Pascal
ребят есть ли у кого по 5 решенных задач по алгоритмам: линейные,разветвляющиеся и циклы (желательно с блок схемами) можно в архиве...


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

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

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