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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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)

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

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bbcby
Eсли перед start /b /low добавить echo, то можно увидеть, что проблема в конструкции "%1%"
При замене оной на "%~1" проблема исчезнет

Всего записей: 1521 | Зарегистр. 18-02-2003 | Отправлено: 22:26 13-05-2019
bbcby

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

Всего записей: 611 | Зарегистр. 11-06-2003 | Отправлено: 22:58 13-05-2019
Sisin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет ли такого приложения, которое приводило бы батники в порядок, т.е. проставляло отступы, где надо исправляло заглавные буквы и наоборот, короче приводило бы батники к определенному стилю??

Всего записей: 993 | Зарегистр. 07-05-2010 | Отправлено: 16:10 15-05-2019 | Исправлено: Sisin, 16:11 15-05-2019
Sisin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, пожалуйста, как исправить батник, чтобы при переносе на него файла, файл сохранялся бы и заменялся в том же месте, а не по пути "C:\12"??
 

Код:
@echo OFF
for %%i in (%*) do (
"program.exe" /F %%i /D "C:\12" /T 2 /DW
erase /Q %%i
)
exit

Всего записей: 993 | Зарегистр. 07-05-2010 | Отправлено: 17:10 22-05-2019 | Исправлено: Sisin, 17:11 22-05-2019
A27

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос. Выполняю цикл for:
 
for /f "usebackq Tokens=1,2,3" %%I in ("Папка\Имя файла с пробелами.log") do Команда
 
специально использовал двойные кавычки, чтобы задать циклу путь и имя файла с пробелами, но цикл сообщает, что File Папка\Имя файла с пробелами.log not found. Как заставить цикл работать? (без type)
 
Ещё вопрос. В цикле for использую SetLocal EnableDelayedExpansion, чтобы раскрывать переменные знаком !, но тут мне понадобилось в теле цикла передать программе строку, содержащую знак !, в результате строка передаётся, но при этом все знаки ! вырезаются. Дублирование !! и ^! не помогает. Как быть?
 
Пример:
 
for /f %I in (...) do (
program.exe /t1 OK! /t2 !RAM
)
 
Sisin, исправьте "C:\12" на "%%~dpi"

Всего записей: 66 | Зарегистр. 30-03-2017 | Отправлено: 16:31 26-05-2019 | Исправлено: A27, 16:33 26-05-2019
wadimuss

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
A27
так:
in ("%~dp0<тут название файла>")
или первой строкой так:
CD /d "%~dp0"

Всего записей: 1029 | Зарегистр. 24-11-2008 | Отправлено: 16:42 26-05-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, A27
1. Кодировка?

Код:
chcp 1251
md "Папка" & echo 678 > "Папка\Имя файла с пробелами.log"
if exist "Папка\Имя файла с пробелами.log" echo Bingo!

2a. ^^!

Код:
setlocal EnableDelayedExpansion
for /f "usebackq Tokens=1,2,3" %%I in ("Папка\Имя файла с пробелами.log") do echo program.exe /t1 OK^^! /t2 ^^!RAM %%I

2b. call :label

Код:
 
for /f "usebackq Tokens=1,2,3" %%I in ("Папка\Имя файла с пробелами.log") do call :exec1 %%I
exit /b
:exec1
  echo program.exe /t1 OK! /t2 !RAM %~1
exit /b
 

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 16:48 26-05-2019
A27

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wadimuss, не, не. Ссылаться на самого себя смысла нет, и переносить лог в текущий каталог, как и переходить в каталог с файлом.
 
Alex_Piggy,
 
1. А кодировка причём? Команда if exist файл находит, но речь не о if, а о for, который в упор не видит файл, если в пути/имени пробелы:
 
C:\Database>set "a=user\logs\2019-05-26 14.58.07.log"
 
C:\Database>if exist "%a%" @echo Lalala
Lalala
 
C:\Database>for /f "usebackq Tokens=*" %I in ("%a%") do @echo %I
The system cannot find the file user\logs\2019-05-26 14.58.07.log.
 
За второе спасибо.
 
P.S. Не понял в чём была проблема: ничего не менял, перезагрузил ПК и всё заработало. Мистика.
 
P.P.S. Подозреваю, что это баг в интерпретаторе команд, может быть какое-то переполнение памяти. Встречался по аналогии с таким, когда в батнике много прыжков Call :Label и конструкций SetLocal - EndLocal, то интерпретатор со временем начинает чудить: при запуске батников в заголовке окна остаётся название предыдущего батника и title не даёт эффекта, ErrorLevel у всех программ (например ping.exe) начинает возвращать всегда одно и то же значение, переменным в SetLocal - EndLocal перестают присваиваться значения, при записи >NUL перед Set интерпретатор начинает "вылетать".

Всего записей: 66 | Зарегистр. 30-03-2017 | Отправлено: 19:20 26-05-2019 | Исправлено: A27, 19:37 26-05-2019
Sisin



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

Цитата:
Sisin, исправьте "C:\12" на "%%~dpi"

 
Не срабатывает.

Всего записей: 993 | Зарегистр. 07-05-2010 | Отправлено: 10:19 27-05-2019
YuS_2



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

Цитата:
речь не о if, а о for, который в упор не видит файл, если в пути/имени пробелы

чтобы for не резал путь по пробелам, необходимо удалить этот символ из соответствующего списка, т.к. он является разделителем по умолчанию:
 26-05-2019

Цитата:
for /f "usebackq Tokens=1,2,3 delims=" %%I in ("Папка\Имя файла с пробелами.log") do Команда

 

Цитата:
usebackq        - применение новой семантики, при которой строка,
                  заключенная в обратные кавычки, выполняется как
                  команда, строка, заключенная в прямые одиночные
                  кавычки, является строкой-литералом, а двойные  
                  кавычки могут использоваться для задания имен  
                  файлов в наборе.
     

Добавлено:
но если таки требуется разделение на токены по пробелу, то "delims=" только навредит.
Перепроверил:
у меня всё работает верно без "delims=", значит проблема у Вас в системе присутствует.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 10:26 27-05-2019 | Исправлено: YuS_2, 11:02 27-05-2019
GCRaistlin



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

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

Только разделителем в строках, содержащихся в указанном файле, а не в пути к нему.
Из текста ошибки:

Цитата:
The system cannot find the file user\logs\2019-05-26 14.58.07.log

видно, что парсер и так ничего не делит. Очевидно, дело в правах доступа, по крайней мере ошибка при этом ровно такая же будет.

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

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 11:02 27-05-2019
YuS_2



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

Цитата:
Только разделителем в строках, содержащихся в указанном файле, а не в пути к нему.

Да, перепроверил уже и пост поправил...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 11:03 27-05-2019
DieMaN



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Всем привет.
Помогите пожалуйста написать батник, условия такие:
1) Есть каталог Home с вложенными каталогами пользователей user1, user2, user3 и т.д.
2) Необходимо найти все файлы по маске *.doc в каталогах пользователей и добавить их в архив с сохранением путей. Т.е. чтобы получился архив Home с вложенными каталогами user1, user2, user3 и т.д. только с doc файлами внутри.

Всего записей: 169 | Зарегистр. 28-12-2003 | Отправлено: 12:36 28-05-2019
Furee



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DieMaN
Цитата:
Всем привет.  Помогите пожалуйста написать батник, условия такие:  1) Есть каталог Home с вложенными каталогами пользователей user1, user2, user3 и т.д.  2) Необходимо найти все файлы по маске *.doc в каталогах пользователей и добавить их в архив с сохранением путей. Т.е. чтобы получился архив Home с вложенными каталогами user1, user2, user3 и т.д. только с doc файлами внутри.

Бывает же такое. Не поверите, буквально вчера понадобилось решить подобную задачу )).  
В общем вот посмотрите, что я сделал для себя (с частью этого кода для другой похожей задачи мне помогли тут же форуме).  
Вам осталось только прикрутить архивацию своего архиватора к %DESTDIR%.  
Вот тут
Код:
FOR /r %SOURCEDIR% %%i in (*.doc)  
через запятую добавляйте свою маску если нужно, например (*.doc, *.docx, *.xls, *.xslx, *.rtf) и т.д.

Код:
 
@ECHO off
SETLOCAL EnableExtensions
SETLOCAL EnableDelayedExpansion
reg add "HKLM\SOFTWARE\Microsoft\Command Processor" /v DisableUNCCheck /t REG_DWORD /d 00000001 /f > NUL
ECHO.
::=======================================
SET "SOURCEDIR=С:\My_Source_Folder\"
SET "DESTDIR=C:\My_Destination_Folder"
::=======================================
ECHO. && ECHO. - START PROCESSING FILES IN "%SOURCEDIR%"... && ECHO. && ping 127.0.0.1 -n 2 > NUL
FOR /r %SOURCEDIR% %%i in (*.doc) DO (@ECHO %%i >>$)
FOR /f "usebackq tokens=1* delims=[]" %%A in (`^<$ find /n /v ""`) DO (  
     SET /a COUNTER=%%A  
     SET "ROW%%A=%%B"
     )  
ECHO. - TOTAL FOUND [%COUNTER%} FILES. && ECHO. && ping 127.0.0.1 -n 3 > NUL
SETLOCAL EnableDelayedExpansion
    FOR /l %%N in (1,1,%COUNTER%) DO (
         FOR /f "tokens=* delims=" %%C in ("!ROW%%N!") DO (
            ECHO. - PROCESSING FILE: ^[%%N^] of ^[%COUNTER%^] - %%~nC%%~xC
            xcopy "!ROW%%N!" "%DESTDIR%%%~pC" /F /R /Y /I >NUL
        )
    )
ECHO. && ECHO. - COMPLETE PROCESSING FILES IN "%SOURCEDIR%". && ECHO. - TOTAL ^[%COUNTER%^] FILES PROCESSED. && ECHO. - SELECTED COPIED TO "DESTDIR%\".
ping 127.0.0.1 -n 4 > NUL
DEL $
EXIT /B
 


----------
Furee will make your Kaspersky be free ;)

Всего записей: 766 | Зарегистр. 13-10-2014 | Отправлено: 15:08 28-05-2019 | Исправлено: Furee, 15:14 28-05-2019
A27

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

Цитата:
Не срабатывает.

 
Sisin, решение было дано верное, что конкретно не срабатывает? Файл сохраняется по прежнему в C:\12? Или не изменяется? Или что-то другое? Вы пишите конкретнее, тут нет телепатов.
 
Ладно, прикинусь телепатом: у Вас есть ошибка в коде, добавьте после строки
 
@echo OFF
 
строку
 
CD %~dp0

Всего записей: 66 | Зарегистр. 30-03-2017 | Отправлено: 18:18 28-05-2019
NIKZZZZ



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DieMaN
На примере 7-zip, скрипт должен находиться рядом с Home

Код:
CD /d "%~dp0"
set source=Home
set arc=Home.7z
7z.exe a "%arc%" "%source%\*.doc" -r
rem можно добавить и другие расширения
rem 7z.exe a "%arc%" "%source%\*.docx" -r

 
A27

Цитата:
@echo OFF
 
строку
 
CD %~dp0

Более корректно

Код:
CD /d "%~dp0"

 
 

Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 03:24 29-05-2019 | Исправлено: NIKZZZZ, 03:36 29-05-2019
Sisin



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

Цитата:
@echo OFF    строку    CD %~dp0

 
Вот хоть убейте, но не срабатывает:

Код:
@echo OFF
CD /d "%~dp0"  
for %%i in (%*) do (
"C:\12\program.exe" /F "%%i" /D "%%~dpi" /T 2 /DW"
)
pause

 
И так CD /d "%~dp0" , и так CD /d %~dp0
 
Программа, которой передается "%%~dpi" пишет, что нет такого пути.
 
Может еще какие-нибудь варианты???

Всего записей: 993 | Зарегистр. 07-05-2010 | Отправлено: 10:38 29-05-2019 | Исправлено: Sisin, 10:39 29-05-2019
DieMaN



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Furee
NIKZZZZ
Оба варианта отличные, спасибо большое! Чтобы я делал без вас

Всего записей: 169 | Зарегистр. 28-12-2003 | Отправлено: 10:39 29-05-2019
YuS_2



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

Цитата:
Вот хоть убейте, но не срабатывает

Пробую стелепатировать:
1. Под ключом /F должно присутствовать имя файла с расширением, без пути  
2. Под ключом /D должен быть путь к каталогу без конечного слэша.
Учитывая мои плохие способности в телепатии, попробуйте переделать свой код в такой:

Код:
@echo OFF  
for %%i in (%*) do (  
    "C:\12\program.exe" /F "%%~nxi" /D "%cd%" /T 2 /DW"  
)  
pause

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 11:21 29-05-2019
Sisin



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

Цитата:
@echo OFF   for %%i in (%*) do (       "C:\12\program.exe" /F "%%~nxi" /D "%cd%" /T 2 /DW"   )   pause  

 
Супер)) Телепатия сработала))) Спасибо.

Всего записей: 993 | Зарегистр. 07-05-2010 | Отправлено: 11:48 29-05-2019
   

Страницы: 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.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru