Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

Открыть новую тему     Написать ответ в эту тему

cchameleone



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Командная строка, батники\сценарии (bat, cmd)
(часть 1) (часть 2) (часть 3) (часть 4)
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Примечание: Большие куски кода заключайте в тэг [ more ].  

Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Microsoft Windows » Сценарии Windows

Полезные ссылки:
· Из Windows XP Professional Product Documentation:
» Описание Cmd.exe » Command shell overview
» Using batch files » Using batch parameters » Using filters » Using command redirection operators
 
· Уроки bat-аники (для начинающих): первый и второй
· Курс из 19 лекций "Командная строка и сценарии Windows"
· Попов А. Командная строка и сценарии Windows (PDF). Курс лекций для начинающих
· Бокалий В. Командная строка (pdf-брошюрка в 20 страниц)
· Александров А., Дибров А. Урок bat-аники (pdf)
· Уильям Р. Станек - Командная строка Windows. Справочник администратора
 
· Скрываем консольные окна
· cmdow — изменение параметров и видимости дос-окна, Статья в КОМПЬЮТЕРРАONLINE
· Набор GNU утилит для win32
· HS_Packet.7z - Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· blat — отправка почты из консоли
· Команды RunDll32
· Quick Batch File Compiler - Позволяет превратить ваш батник в независимое приложение
· Easy Batch Builder+Rus+Crack - Редактор BAT файлов.Через графический интерфейс программы вы сможете быстро конструировать пакетные файлы практически любой сложности. (В комплекте есть Лоадер созданный с помощью Sign Of Misery некоторые антивирусы обзывают его вирусом. Вам решать: ставить или не ставить) (ЗЕРКАЛО)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек) ещё и ещё
· Переход из 32-битной версии cmd.exe в 64-битную (1) (2)

Всего записей: 2259 | Зарегистр. 16-10-2015 | Отправлено: 09:22 29-04-2016 | Исправлено: cchameleone, 20:42 22-02-2018
Jonmey

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
A27
Аналогично этому
В зависимости от OC и желаний доустановки доп. компонентов раcкомментировать-комментировать 4-ю и 2-ю строки с конца.

Всего записей: 172 | Зарегистр. 17-01-2011 | Отправлено: 10:21 14-06-2018 | Исправлено: Jonmey, 10:22 14-06-2018
Deoptimizer

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день.
Имеется WinPE(Windows Setup) с урезанными возможностями.
Нужно сделать элементарную паузу 3 секунды в скрипте.
 
Не работает ping(т.к. WinPE без сетевых настроек):

Код:
ping 127.0.0.1 -n 3 >nul

 
Не работает timeout:

Код:
timeout /t 3

 
Нашел возможность использования cscript(и оно работает):

Код:
 
echo wsh.sleep 3*1000>%temp%\sleep.vbs
cscript //b //nologo %temp%\sleep.vbs
del %temp%\sleep.vbs
 

Но это не оптимально как вы понимаете.
 
Добавлено:
Хотелось бы одной командой, без всяких манипуляций с файлами и прочее.
 
Добавлено:
Короче решил одной мульти-командой(одной строкой):

Код:
echo WScript.Sleep^(WScript.Arguments^(0^)^) >"%temp%\sleep.vbs" && cscript //NoLogo "%temp%\sleep.vbs" 3000 >nul && del "%temp%\sleep.vbs"

 
Как альтернатива, есть внешняя программа millisleep.exe:

Код:
millisleep.exe 3000

Всего записей: 168 | Зарегистр. 12-06-2015 | Отправлено: 11:17 14-06-2018 | Исправлено: Deoptimizer, 11:29 14-06-2018
Start



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Deoptimizer
Находил я такой пример, но хотелось-бы его переделать в миллисекунды, если такое возможно:

Код:
@echo off
:: Пример использования
:: Некоторые действия
 
echo Сейчас %time:~0,-3%
:: пауза на 3 секунды
call :sleep 3
 
start notepad.exe
 
echo Сейчас %time:~0,-3%
:: пауза на 5 секунд
call :sleep 5
 
:: Другие действия
 
echo Сейчас %time:~0,-3%
start /w calc.exe
 
::
 
goto :EOF
 
:sleep
       echo Пауза на %1 секунд...
       set /a ftime=%time:~6,-3%+%1
       if %ftime% GEQ 60 set /a ftime-=60
    :loop
               set ctime=%time:~6,-3%
       if /i %ftime% NEQ %ctime% goto :loop
goto :EOF

Всего записей: 527 | Зарегистр. 28-01-2006 | Отправлено: 12:05 14-06-2018
Pasha_ZZZ



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Start
Так-то %TIME% выводит и сотые доли секунды, вполне себе можно с точностью до сотых

Всего записей: 7172 | Зарегистр. 11-03-2002 | Отправлено: 12:20 14-06-2018
Deoptimizer

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Start
Вот есть уже написанный скрипт(там же по ссылке тестирование разных видов задержек):

Код:
 
@echo off
 
:waitFor
setlocal enabledelayedexpansion
  set "sleepFor=%~1"
 
  call :currentTime startTime
  :: Note, dont use a for loop, the cmd prompt would try to expand each iteration, and that is a big problem
  :loopStart
    call :currentTime curTime
    call :getTimeDiff result !startTime! !curTime!
 
   set /A timeDiffMs=!result!*10
   if !timeDiffMs! GTR !sleepFor! ( goto :return )
 
   set /A timeRemaining=!sleepFor!-!timeDiffMs!
   if !timeRemaining! GTR 1200 ( timeout /nobreak /t 1 >nul 2>&1 )
  goto :loopStart
 
  :return
endlocal
goto :eof
 
:currentTime
setlocal
  set "curTime=%TIME%"
  :: For some stupid reason if the hour < 10, it uses a blank space instead of a leading zero
  if [^%curTime:~0,1%]==[^ ] set "curTime=0%curTime:~1%"
endlocal & set %~1=%curTime%
goto :eof
 
:getTimeDiff
setlocal
  set "startTime=%~2"
  set "endTime=%~3"
 
  set /A startTime=(1%startTime:~0,2%-100)*360000 + (1%startTime:~3,2%-100)*6000 + (1%startTime:~6,2%-100)*100 + (1%startTime:~9,2%-100)
  set /A endTime=(1%endTime:~0,2%-100)*360000 + (1%endTime:~3,2%-100)*6000 + (1%endTime:~6,2%-100)*100 + (1%endTime:~9,2%-100)
  set /A duration=%endTime%-%startTime%
  if %endTime% LSS %startTime% set set /A duration=%startTime%-%endTime%
endlocal & set "%~1=%duration%"
goto :eof
 

Должен запускаться с помощью call :waitFor 2500 (где 2500 -  это миллисекунды)
Но он у меня почему-то не работает.

Всего записей: 168 | Зарегистр. 12-06-2015 | Отправлено: 12:26 14-06-2018 | Исправлено: Deoptimizer, 12:32 14-06-2018
Start



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Deoptimizer, у меня этот скрипт тоже не работает.

Всего записей: 527 | Зарегистр. 28-01-2006 | Отправлено: 13:08 14-06-2018
Deoptimizer

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот есть еще одна внешняя программа.
Она занимает только 7кб по размеру.
Можно использовать доли секунды, т.е. например 0.1 или 3.5 и прочее.
Как бонус, можно отменить(abort) задержку любой заданной клавишей или ESC/ENTER/прочее.

Всего записей: 168 | Зарегистр. 12-06-2015 | Отправлено: 13:17 14-06-2018 | Исправлено: Deoptimizer, 13:19 14-06-2018
Pasha_ZZZ



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот переделал скрипт для работы с миллисекундами, но точность только до сотых (как выдает %TIME%).
Цитата:
@echo off
echo 3000 ms
call :Sleep 3000
goto :eof
 
:Sleep
set ftime=%time:~6%
set ftime=1%ftime:,=%
set /a ftime=%ftime:,=%+%1/10-10000
echo ftime="%ftime%", time="%time%"
if %ftime% GEQ 6000 set /a ftime-=6000
:Loop
set ctime=%time:~6%
if %ftime% GTR %ctime:,=% goto :Loop
goto :eof

Всего записей: 7172 | Зарегистр. 11-03-2002 | Отправлено: 13:35 14-06-2018
Arhaall

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа, можно ли как-то решить через комстроку следующую задачу: нужно переименовать выбраный файл при этом чтобы новое имя файла автоматически бралось из буфера.

Всего записей: 7 | Зарегистр. 22-02-2018 | Отправлено: 14:32 14-06-2018
Start



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Deoptimizer, Pasha_ZZZ, спасибо вам за утилиты millisleep.exe и Wait.exe и код для работы с миллисекундами. Всё проверил, работают великолепно!
 
Pasha_ZZZ, у меня есть небольшой вопрос - этот код, для работы с миллисекундами, он содержит в себе JS скрипт или там только команды cmd?

Всего записей: 527 | Зарегистр. 28-01-2006 | Отправлено: 14:43 14-06-2018
BorlandIMHO

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arhaall

Цитата:
можно ... переименовать выбраный файл при этом чтобы новое имя файла автоматически бралось из буфера

Встроенными средствами командной строки - нет; вариант с использованием утилиты paste:

Код:
@echo OFF
set "PATH2RENAME=x:\path to"
set "FILE2RENAME=Some file.bin"
for /f "usebackq delims=" %%A in (`paste`) do set "CLIPBOARDC=%%A"
echo ren "%PATH2RENAME%\%FILE2RENAME%" "%PATH2RENAME%\%CLIPBOARDC%"
pause

Для "боевого" применения - уберите echo перед командой переименования и pause после неё.

----------
http://www.imho.ws

Всего записей: 952 | Зарегистр. 12-10-2006 | Отправлено: 15:29 14-06-2018 | Исправлено: BorlandIMHO, 15:32 14-06-2018
A27

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jonmey, rundll32.exe не даёт никакого эффекта. При использовании setx.exe необходимо перезапускать .bat так как любой другой вызванный им батник тоже не видит переменную до перезапуска консоли, к тому же setx.exe не умеет удалять глобальные переменные.
 
Нашёл в интернете вариант с Wmic:
 
WMIC Environment Where Name="CLASSPATH" SET VariableValue="XXX"
 
но он тоже не фурычит, ругается No Instance Available.
 
Через "Wmic Environment Set Var Value" тоже не выходит, просит какой-то Assigned List - хрен знает что это.
 
На данный момент создаю, считываю и удаляю переменные только через задницу reg.exe.

Всего записей: 15 | Зарегистр. 30-03-2017 | Отправлено: 18:38 14-06-2018 | Исправлено: A27, 18:51 14-06-2018
526549



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Попалась головоломка, которую решить не смог. Казалось бы задача пустяковая, но решения не вижу.
Открываю командную строку. И пишу  
set test=42
echo %test%
Я получу 42.
Но если я в консоли напишу это одной строкой через "&", то я не получу "42". Переменная не сохраняется без, скажем так, разрыва строки скрипта. Символ & не заставляет моментально записать переменную.  
Последующий вызов этого же заклинания. "set test=42 & echo %test%" уже отобразит 42, потому что сеанс консоли тот же и переменная сохранилась. Но если снова открыть консоль и написать "set test=42 & echo %test%" получим дульку.
Подскажите как заставить консоль сразу запомнить переменную одной строкой.  
Была найдена вариация решения для cmd-скрипта: "@Setlocal EnableDelayedExpansion & set Test=42 & echo !Test! & pause" - выдает 42 из батника, но опять же в запущеной консоли выдает "!Test!"
В общем надеюсь, что мою головную боль вы поняли. Помогите с решением, пожалуйста. Уточню повторно, что нужно не в батнике это сделать. а сразу в сеансе консоли с первого раза.

Всего записей: 353 | Зарегистр. 20-01-2007 | Отправлено: 15:02 15-06-2018 | Исправлено: 526549, 15:04 15-06-2018
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
526549

Цитата:
если снова открыть консоль и написать "set test=42 & echo %test%" получим дульку.

В этом случае всегда будет даже не дулька, а огромная фига т.к. запись вида:

Код:
команда1&команда2

равнозначна:

Код:
(
команда1
команда2
)

и соответственно, раскрытие переменных, назначенных внутри скобок, необходимо делать только через отложенное раскрытие, иначе они будут принимать значения, имевшиеся до входа в оператор "скобки".
- от этого и пляшите...
 
Добавлено:

Цитата:
Помогите с решением, пожалуйста. Уточню повторно, что нужно не в батнике это сделать. а сразу в сеансе консоли с первого раза.

хинт:

Код:
cmd /v /c "set test=42 & echo !test!"

Всего записей: 2054 | Зарегистр. 03-02-2009 | Отправлено: 15:27 15-06-2018
526549



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Спасибо!

Всего записей: 353 | Зарегистр. 20-01-2007 | Отправлено: 16:20 15-06-2018
Smitis

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Но если я в консоли напишу это одной строкой через "&", то я не получу "42". Переменная не сохраняется без, скажем так, разрыва строки скрипта. Символ & не заставляет моментально записать переменную.

Интерпретация строки работает так: сначала подставляются значения переменных в %%. Затем строка выполняется. Подстановка переменной в команду "echo %test%" произойдёт ДО того, как переменной будет присвоено значение. При повторном "вызове того же заклинания", переменной УЖЕ присвоено значение. Ради интереса, во втором вызове присвойте ДРУГОЕ значение - будет выведено первое.


----------
Разум когда-нибудь победит

Всего записей: 1401 | Зарегистр. 09-02-2003 | Отправлено: 22:10 15-06-2018
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis

Цитата:
 Ради интереса, во втором вызове присвойте ДРУГОЕ значение - будет выведено первое.

Да, это верно как расширенное объяснение того, что  

Код:
команда1&команда2

эквивалент:

Код:
(  
команда1  
команда2  
)

 
но, всё равно, вариант обхода таки существует ведь:

Код:
set test=42&call echo %test%

это же cmd

Всего записей: 2054 | Зарегистр. 03-02-2009 | Отправлено: 09:15 16-06-2018
Smitis

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
YuS_2
При непосредственно выполнении из командной строки несуществующие переменные не раскрываются (остаются как есть).
Команда call вызывает новую копию командного процессора с новой унаследованной средой в которой переменная уже есть. Так как несуществующие переменные не раскрываются, в новой среде будет выполнена строка echo %test% в которую перед выполнением подставится значение.
Попробуйте запустить новую копию командного процессора и в командной строке последовательно выполнить
set test=44
set test=42&call echo %test%
 
Так что это не вариант обхода.
 
На самом деле командный процессор выполняет код некими блоками, перед выполнением в которые происходит подстановка переменных среды. Обычно это одна строка. Но может быть и несколько строк, объединённых скобками, причём блок состоит из целых строк, поэтому в него включается всё перед открывающей скобкой до начала строки и всё до конца строки после закрывающей.

----------
Разум когда-нибудь победит

Всего записей: 1401 | Зарегистр. 09-02-2003 | Отправлено: 18:29 16-06-2018 | Исправлено: Smitis, 18:32 16-06-2018
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis

Цитата:
Так что это не вариант обхода.

А, ну да, точно, это же не пакетник, а консоль... в пакетниках это пролазит из-за удвоения символов процентов, а здесь фига с маслом
Ну, тогда остается вариант отсюда:  15-06-2018
 

Цитата:
На самом деле

На самом деле, это какая-то больная голова выдумывала все эти выверты... по сути, программирование через задницу. Иногда, чтобы сделать достаточно простую вещь, приходится выворачиваться наизнанку и писать портянки кода

Всего записей: 2054 | Зарегистр. 03-02-2009 | Отправлено: 19:05 16-06-2018
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
YuS_2

Цитата:
На самом деле, это какая-то больная голова выдумывала все эти выверты... по сути, программирование через задницу

На самом деле, это очень мощное средство, позволяющее с помощью лаконичного кода делать интересные вещи.

----------
Magically yours
Raistlin

Всего записей: 2144 | Зарегистр. 18-04-2005 | Отправлено: 01:42 17-06-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2018

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru