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

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

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

Maz (19-09-2020 13:36): Командная строка, батники, сценарии (bat, cmd) Часть 6  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

   

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. Справочник администратора
 
· Скрываем консольные окна, Выполнение BAT-скриптов без вызова окна консоли
· 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)(3)

Всего записей: 2271 | Зарегистр. 16-10-2015 | Отправлено: 09:22 29-04-2016 | Исправлено: Maz, 08:47 26-03-2020
Jonmey

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

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

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день.
Имеется 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

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



Advanced 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

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



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

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

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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 -  это миллисекунды)
Но он у меня почему-то не работает.

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



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

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

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

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



Platinum 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

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



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

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



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

Всего записей: 620 | Зарегистр. 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

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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.

Всего записей: 58 | Зарегистр. 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!"
В общем надеюсь, что мою головную боль вы поняли. Помогите с решением, пожалуйста. Уточню повторно, что нужно не в батнике это сделать. а сразу в сеансе консоли с первого раза.

Всего записей: 358 | Зарегистр. 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!"

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



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

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



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

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

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


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

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



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

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

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

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

эквивалент:

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

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

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

это же cmd

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



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

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

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



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

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

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

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

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

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



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

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

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

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

Всего записей: 3142 | Зарегистр. 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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)
Maz (19-09-2020 13:36): Командная строка, батники, сценарии (bat, cmd) Часть 6


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru