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

Batch (CMD/BAT)

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Dragokas
Эксперт WindowsАвтор FAQ
16106 / 6925 / 834
Регистрация: 25.12.2011
Сообщений: 10,692
Записей в блоге: 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2013, 15:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Каталог простых примеров решенных задач 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
16106 / 6925 / 834
Регистрация: 25.12.2011
Сообщений: 10,692
Записей в блоге: 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
16106 / 6925 / 834
Регистрация: 25.12.2011
Сообщений: 10,692
Записей в блоге: 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
16106 / 6925 / 834
Регистрация: 25.12.2011
Сообщений: 10,692
Записей в блоге: 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
16106 / 6925 / 834
Регистрация: 25.12.2011
Сообщений: 10,692
Записей в блоге: 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
16106 / 6925 / 834
Регистрация: 25.12.2011
Сообщений: 10,692
Записей в блоге: 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
16106 / 6925 / 834
Регистрация: 25.12.2011
Сообщений: 10,692
Записей в блоге: 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
1627 / 336 / 39
Регистрация: 15.10.2012
Сообщений: 529
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
16106 / 6925 / 834
Регистрация: 25.12.2011
Сообщений: 10,692
Записей в блоге: 16
30.04.2015, 21:35  [ТС] #39
Получение N-й строки с конца файла.
1
30.04.2015, 21:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2015, 21:35
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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