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

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
regist123, thejustsoul Ну если такие ответы, тогда тема закрыта.  

Всего записей: 102 | Зарегистр. 13-11-2007 | Отправлено: 19:53 27-05-2017
thejustsoul



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ZVSRus
Это если exe не требует прав админа, очистка кэша значков поможет, а так, в Bat_To_Exe_Converter снимите "добавить манифест администратора" и не будет "замочка" на значке.

Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 03:51 28-05-2017
RamblingBeard



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем добрый день.
Возник вот такой вопрос. Можно ли в командной строке перенаправить вывод данных из процесса в excel-файл?
 
Делал так:
process_name > D:\logs\new_log.xls
 
Файл создается, но он не совсем корректный. При его открытии появляется вот такое сообщение:
 
   
 
Сам процесс поддерживает вывод в такой файл, но я хотел бы перенаправлять в свой, кастомный.
Подскажите, можно ли как-то решить проблему. Заранее благодарен.

Всего записей: 46 | Зарегистр. 19-10-2014 | Отправлено: 09:19 02-06-2017 | Исправлено: RamblingBeard, 16:16 03-06-2017
clammer

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте
 
пробовал сам БАТник написать - не разобрался в ACL-параметрах
Опишу задачу:
 
есть сложная структура папок в файлопомойке вида:
000/001/.../.../DirX/.../.../file1
...
000/001/.../.../DirX/.../.../fileN
...
000/002/.../.../DirX/.../.../file1
...
000/002/.../.../DirX/.../.../fileN
...
000/999/.../.../DirX/.../.../file1
...
000/999/.../.../DirX/.../.../fileN
 
Начиная с папки DirX (и все в нее вложенное) имеет "левого" владельца и, соответственно, "левые" разрешения доступа.
 
Требуется пакетно на папку DirX (+ все в нее вложенное) задать владельца "Администраторы", и установить права доступа как наследуемые от вышестоящей папки.
 
Затрагивать владельцев и права доступа на другие объекты - нельзя.
Т.е. нельзя, например, взять и включить наследование владельцев и прав доступа от корневой папки
 
Есть лист-файл, в котором каждая строка - полный путь от корня диска до папки DirX.
 
Помогите, плиз - дайте БАТ-ник для выполнения этой задачи.
 
Upd.
Владельца пакетно удалось поменять на все папки DirX (и вложенные в нее объекты), а вот права от вышестоящей папки отнаследовать - не получилось.
Помогите, плиз, наследование прав распространить как в примере:
000/001/.../DirY/DirX/.../.../file1 - нужно включить наследование прав от папки DirY.

Всего записей: 37 | Зарегистр. 04-02-2006 | Отправлено: 11:15 04-06-2017 | Исправлено: clammer, 11:23 04-06-2017
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RamblingBeard
Ни одна из известных мне программ не выводит в консоль данных в формате excel, что и неудивительно: бинарный файл нечитаем в текстовом виде по-определению.
Самое близкое к форматам excel, что выдаётся в консоль - это CSV.
Т.е. вывод нужно перенаправлять в .csv, а уже потом скармливать его ёкселю и, если надо, сохранять в бинарный ёксельный формат.

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

Всего записей: 2575 | Зарегистр. 12-10-2006 | Отправлено: 15:19 04-06-2017
RamblingBeard



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

Цитата:
Т.е. вывод нужно перенаправлять в .csv, а уже потом скармливать его ёкселю и, если надо, сохранять в бинарный ёксельный формат.

 
Можно ли сделать это средствами cmd?
 

Всего записей: 46 | Зарегистр. 19-10-2014 | Отправлено: 09:37 05-06-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
RamblingBeard
Вывод в экселевский документ не перенаправить. Никак. CSV можно открыть в экселе через CMD, но он может быть не ассоциирован с экселем, например. В общем и целом лучше JS/VBS

Всего записей: 12738 | Зарегистр. 11-03-2002 | Отправлено: 13:46 05-06-2017
RamblingBeard



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

Цитата:
В общем и целом лучше JS/VBS

 
Вы имеете ввиду, что перенаправление в эксель можно сделать через JS/VBS?

Всего записей: 46 | Зарегистр. 19-10-2014 | Отправлено: 11:33 06-06-2017 | Исправлено: RamblingBeard, 11:34 06-06-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
RamblingBeard
Никогда больше не употребляйте слово "перенаправление" вместе с "эксель" - все станет гораздо проще.

Всего записей: 12738 | Зарегистр. 11-03-2002 | Отправлено: 12:07 06-06-2017
Falcon99



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу помощи. Для оптимизации изображений с помощью консольной программы jpegoptim.exe используется bat файл находящийся в подменю отправить. Т.е. алгоритм работы следующий. Выделяются нужные файлы, потом правой клавише "отправить" и внутри"сжать файлы.bat". Сам не сильно разбираюсь в программировании, поэтому брал из интернета чужой код и переделывал под себя.
Потребовалось добавить логирование, но вывод получается в другой кодировке. Ниже привожу код коммандного файла.
 

Код:
@echo off
:loop
if %1=="" pause & exit
jpegoptim --strip-all --all-progressive -ptm80 ""%1""
echo %1 >> c:\обработано.txt
shift
goto :loop  

 
Посоветуйте как можно подправить, чтобы ввывод в файл выходил в кодировке windows 1251, для нормально чтения в обычном блокноте.
 
P.s. Кроме того есть дополнительный вопрос. Пока в строке " jpegoptim --strip-all --all-progressive -ptm80 ""%1"" " не заключил %1 в двойные кавычки были проблемы если в пути к файлу имелись пробелы.  
P.p.s. И еще, будут ли проблемы при выполнении данного скрипта, когда выбрано большое количество файлов, а также если файлы имеют длинный путь.
 
P.p.p.s. Скрипт вроде работает, но гложут сомнения, а правильный ли он вообще или данную задачу надо было решать по другому.

Всего записей: 607 | Зарегистр. 12-10-2005 | Отправлено: 11:16 07-06-2017 | Исправлено: Falcon99, 11:30 07-06-2017
irsemi

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Falcon99
Я давно хотел наладить что-то подобное, но все никак "руки не доходили"
 
Теперь попробовал ваш пример.
 
1. В конце он вылетает без паузы. Если запустить из консоли, то выдаёт ошибку:  
Непредвиденное появление: pause
 
2. В заключении ""%1"" тоже ИМХО ничего хорошего нет.
Дело в том, что в %1 если имя файла содержит пробелы, то оно там идёт сразу с кавычками! И лишние несколько кавычек ни к чему хорошему не приводят.
 
Конструкция %1 дает имя с кавычками, только когда они нужны, %~1 дает имя без кавычек, а "%~1" даст имя всегда с одной парой кавычек.
Подробнее: в командной строке набрать help call
 
chcp 1251 позволяет вроде переключить вывод на нужную вам кодовую страницу, но могут возникнуть некоторые странности.
 
Вот такой пример вроде рабочий:

Код:
@chcp 1251
:loop
@IF "%~1" == "" chcp 866 & PAUSE & EXIT /b
@jpegoptim --strip-all --all-progressive -ptm80 "%~1"
@ 1>>"c:\обработано.txt" echo %1
@shift
@GOTO :loop

 
Или так:
 

Код:
@echo off
chcp 1251
:loop
IF "%~1" == "" chcp 866 & PAUSE & EXIT /b
jpegoptim --strip-all --all-progressive -ptm80 %1
1>>"c:\обработано.txt" echo %1
shift
GOTO :loop

 
А о количестве - у меня на windows 7 удалось передать всего 100 файлов (8000 символов), если сильно больше (>32000 символов):
"Имя файла или его расширение имеет слишком большую длину"

Всего записей: 89 | Зарегистр. 28-11-2016 | Отправлено: 02:58 08-06-2017 | Исправлено: irsemi, 03:24 08-06-2017
Falcon99



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
irsemi
Спасибо за помощь и подробный ответ. Особенно за тестировании количества обрабатываемых файлов.
 

Цитата:
1. В конце он вылетает без паузы. Если запустить из консоли, то выдаёт ошибку:  
Непредвиденное появление: pause  

 
У меня на всех машинах установлена Windows XP и ошибок не было, да и пауза если честно мне не нужна, т.к. цикл брался целиком из примера с похожей задачей и вроде работал, то на это я просто не обратил внимания. Теперь наверное можно сразу делать выход из цикла, без остоновки для показа работы утилиты.
 

Цитата:
2. В заключении ""%1"" тоже ИМХО ничего хорошего нет.
Дело в том, что в %1 если имя файла содержит пробелы, то оно там идёт сразу с кавычками! И лишние несколько кавычек ни к чему хорошему не приводят.  

 
Изначально я использовал просто %1, но словил что на некоторых файлах утилита не получала путь к файлу, поэтому я решил что данный параметр передается без кавычек и просто добавил их, но на другой машине опять путь не передавался корректно, и почему-то решил что их удвоение решит эту проблему, как ни странно это помогло...

Всего записей: 607 | Зарегистр. 12-10-2005 | Отправлено: 08:58 08-06-2017
aseyeff



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
RamblingBeard
Из консольлных ср-в Вам можно воспользоваться Powershell и соответсвенно вызовом сервера автоматизации excel или как было отмечено писать в csv формате

Всего записей: 497 | Зарегистр. 04-02-2003 | Отправлено: 13:13 08-06-2017
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обнаружил пару интересных фич:

  1. Если FOR при парсинге возвращает пустую строку и результат его выполнения проверяется через "||", он устанавливает errorlevel в 1, иначе не меняет его:

    Код:
     
    set /a 0
    (for /f %%A in ("") do (
      rem
    )) || rem
    echo %errorlevel%
     
    set /a 0
    (for /f %%A in ("") do (
      rem
    ))
    echo %errorlevel%
     

  2. Невыполнившийся IF возвращает 0, но не меняет errorlevel:

    Код:
     
    color 00
    (if 1 == 2 color 00) && echo 0 || echo 1
    echo %errorlevel%
     



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

Всего записей: 4113 | Зарегистр. 18-04-2005 | Отправлено: 19:39 16-06-2017 | Исправлено: GCRaistlin, 17:35 18-06-2017
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Фича №2 позволяет реализовать в одной строке ELSE для нескольких условий одновременно:

Код:
 
set A=1
set B=2
call :Test
set A=1
set B=1
call :Test
exit /b
:Test
(if 1 == %A% if 1 == %B% (
  echo 0
  color 00
)) && echo 1
 


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

Всего записей: 4113 | Зарегистр. 18-04-2005 | Отправлено: 22:07 16-06-2017
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уточнил описание фичи №1.
 
Добавлено:
Фича №1 позволяет установить errorlevel 1 примерно в 4,5 раза быстрее, чем прежним чемпионом - "color 00":

Код:
 
(for /f %%A in ("") do cd) || rem
 


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

Всего записей: 4113 | Зарегистр. 18-04-2005 | Отправлено: 17:36 18-06-2017
Smitis



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

Цитата:
Если FOR при парсинге возвращает пустую строку и результат его выполнения проверяется через "||", он устанавливает errorlevel в 1, иначе не меняет его:  

Вот так ещё интересней

Код:
@echo off
set /a 0
(for /f %%A in ("") do (
  rem
)) || echo %errorlevel%
echo %errorlevel%




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

Всего записей: 3397 | Зарегистр. 09-02-2003 | Отправлено: 19:20 19-06-2017 | Исправлено: Smitis, 19:24 19-06-2017
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Тут как раз ничего интересного - первый %errorlevel% раскроется в 0, что бы ни стояло перед ним, так что FOR ни при чем. А вот так действительно забавно:

Код:
 
color 00
(if 1 == 2 cd) && if errorlevel 1 echo 1
 


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

Всего записей: 4113 | Зарегистр. 18-04-2005 | Отправлено: 20:52 19-06-2017
Smitis



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

Цитата:
Тут как раз ничего интересного - первый %errorlevel% раскроется в 0, что бы ни стояло перед ним

Точнее так: он раскроется в то, что было перед for.
 

Цитата:
А вот так действительно забавно

Есть предположение, что в if errorlevel "подставляется" так же, как и переменные. Т.е., в данном случае обработается результат color, который был установлен на момент обработки строки с if, а реальный errorlevel будет доступен в следующей строке.

Код:
color 00
cd > nul & echo %errorlevel%
echo %errorlevel%

 


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

Всего записей: 3397 | Зарегистр. 09-02-2003 | Отправлено: 21:23 19-06-2017 | Исправлено: Smitis, 21:23 19-06-2017
GCRaistlin



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

Цитата:
Есть предположение, что в if errorlevel "подставляется" так же, как и переменные.

Это не так. if errorlevel оперирует реальным errorlevel:

Код:
 
(
  color 00
  if errorlevel 1 echo 1
  set /a 0
  if not errorlevel 1 echo 0
)
 

 

Цитата:
в данном случае обработается результат color, который был установлен на момент обработки строки с if, а реальный errorlevel будет доступен в следующей строке.


Код:
 
color 00
(if 1 == 2 cd) && if errorlevel 1 echo 1
echo %errorlevel%
 
set /a 0
color 00 && (if 1 == 2 cd) && if errorlevel 1 echo 1
echo %errorlevel%
 


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

Всего записей: 4113 | Зарегистр. 18-04-2005 | Отправлено: 22:20 19-06-2017
   

Страницы: 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