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

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

Модерирует : KLASS, IFkO

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

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

KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Старые и смежные темы: по CMD и в Программах | по PowerShell | В помощь системному администратору | Прикладное программирование

PowerShell
Версии | Ассоциация и подпись сценариев
Сценарий для ассоциации файлов PowerShell и запуска неподписанных скриптов.
 
Прочее
Расширение возможностей
Функции
Write-Color
Output-DebugString
Провайдеры
Готовые скрипты
Полезные ссылки | Будет ли репозиторий PowerShell на ru-board?
Книги в PDF
Cheat Sheets
 

Cmd
Для перекодирования кириллицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы
 
Готовые решения и частые вопросы
 
Описания работы команд и символов участниками темы:
setlocal enabledelayedexpansion и переменные окружения
символы & и && в командной строке
Переменная %0
 
Полезные ссылки и утилиты

WSH (VBScript, JScript)
Программирование "удобняшек" на VBScript

Примечания:
• Большие куски кода заключайте в тэг [ more ]
• Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте код без пробелов иначе сценарий может работать неправильно. Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

Всего записей: 11058 | Зарегистр. 12-10-2001 | Отправлено: 13:40 17-02-2018 | Исправлено: YuS 2, 08:24 19-06-2021
NIKZZZZ



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

Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 20:00 02-07-2018 | Исправлено: NIKZZZZ, 14:22 04-07-2018
YuS_2



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

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:41 02-07-2018
Baltazar500



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2, ну обновил человек страничку, бывает
 
bash-скрипт благодаря помощи выше был успешно адаптирован под win, хотя и пришлось задействовать пару cygwin-утилит.  
 
Во время адаптации скрипта я вспомнил, что видел в unxutils и наборе cygwin sh.exe и bash.exe соответственно. У меня мелькнула мысль, "а что если сии интерпретаторы натравить напрямую на слегка скорректированный sh-скрипт ?"  
 
После после подсовывания скрипта sh/bash оный вполне себе корректно отработал ))) Есть заморочки с путями до бинарников, но думаю надо пошаманить с переменной PATH внутри скрипта. Особо порадовало то, что в таких скриптах можно использовать виндовые утилиты с "/xxx" ключами.

Всего записей: 2080 | Зарегистр. 19-09-2011 | Отправлено: 14:07 04-07-2018 | Исправлено: Baltazar500, 14:10 04-07-2018
nick7inc



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пишу скрипт для запуска Start_.exe, который запускает PortableAppsPlatform.exe.
Как ожидать окончания работы PortableAppsPlatform.exe? start /wait не подходит, т.к. Start_.exe завершается сразу после запуска второго.  Может есть какой-то апплет из PSTools для отслеживания наличия запущенного процесса?
 
Upd: пока только такой примерчик нашёл, но find не возвращает толком ERRORLEVEL, посему у меня 1й пример не работает.
Нашёл рабочий пример:

Код:
@echo off
set proc=PortableAppsPlatform.exe
tasklist /nh /fi "imagename eq %proc%" | find /i "%proc%" >nul && (
echo %proc% is running
) || (
echo %proc% is not running
)
pause>nul


----------
Джин, не лезь в бутылку.

Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 12:52 05-07-2018 | Исправлено: nick7inc, 13:24 05-07-2018
YuS_2



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

Цитата:
Может есть какой-то апплет из PSTools для отслеживания наличия запущенного процесса?  

Какой апплет? Зачем?
Самый простой вариант:
tasklist в cmd или get-process в powershell
надо только их зациклить до момента завершения работы требуемого приложения и всё.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 13:20 05-07-2018
nick7inc



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Да, разобрался. У меня ни tasklist, ни find не хотели результат возвращать, на экран писали, а в errorlevel ничего не передавали (хотя в 1м примере по ссылке был именно с errorlevel). Тут (в конце сообщения) хоть в конструкцию типа IF это удалось запихнуть. Вроде теперь работает.

----------
Джин, не лезь в бутылку.

Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 13:49 05-07-2018 | Исправлено: nick7inc, 13:54 05-07-2018
AntoshAReal



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте!
Прошу подсказать как исправить ошибку в скрипте (необходимо что бы это был скрипт в одну строку):

Код:
 
for %G in ("Администрация и управление";) do dsquery group "DC=domainname,DC=local" -name %G | for %U in (`dsquery * -filter "(^&(objectcategory=person)(objectclass=user)(sn=Фамилия)(givenName=Имя))"`) do echo dsmod group -addmbr "%U"
 

 
Надо что бы  

Код:
dsquery * -filter "(^&(objectcategory=person)(objectclass=user)(sn=Фамилия)(givenName=Имя))"
 
выполнилось и передался вывод в переменную, потом уже должна выполниться команда  

Код:
dsmod group -addmbr "CN=Фамилия Имя Отчество,OU=Администрация,OU=Главный офис,OU=Город,OU=Пользователи,DC=domainname,DC=local"
, где
Код:
"CN=Фамилия Имя Отчество,OU=Администрация,OU=Главный офис,OU=Город,OU=Пользователи,DC=domainname,DC=local"  
вывод команды.
 
 
Разобрался сам:

Код:
 
for %G in ("Администрация и управление";) do dsquery group "dc=domainname,dc=local" -name %G | for /F "Delims=" %U In ('dsquery * -filter "(&(objectcategory=person)(objectclass=user)(sn=Фамилия)(givenName=Имя))"') do echo dsmod group -addmbr "%~U"
 

Всего записей: 305 | Зарегистр. 31-08-2005 | Отправлено: 14:33 05-07-2018 | Исправлено: AntoshAReal, 09:24 06-07-2018
Furee



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

Код:
 
for /f "tokens=1* delims=[]" %%a in ('^<"textfile.txt" find /n /v ""') do (set "row%%a=%%b")
echo. %row1%
echo. %row2%
echo. %row3%
echo. %row4%
echo. %row5%
 

Разобьет textfile.txt на строки и выведет первые 5 строк поочередно - ака ручной режим.  
Но, мне нужно чтоб номер строк увеличивался на единицу автоматически, допустим от 1 до 150.
Думал может добавить цикл for /L

Код:
 
for /f "tokens=1* delims=[]" %%a in ('^<"textfile.txt" find /n /v ""') do (set "row%%a=%%b")
for /L %%c in (1,1,5) do echo. %row%%c%
 

но в результате выдает 5 пустых строк.

Всего записей: 766 | Зарегистр. 13-10-2014 | Отправлено: 03:27 08-07-2018 | Исправлено: Furee, 03:30 08-07-2018
YuS_2



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

Цитата:
Но, мне нужно чтоб номер строк увеличивался на единицу автоматически, допустим от 1 до 150.

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

Код:
set row

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

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 08:54 08-07-2018
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Furee
Если пустые строки НЕ нужны и их можно игнорировать (или отсутствуют как класс):

Код:
@echo off
setlocal ENABLEDELAYEDEXPANSION
set /a COUNTER=0
for /f "tokens=*" %%A in (TechInfo.txt) do (
    set /a COUNTER+=1
    set "ROW!COUNTER!=%%A"
)
for /l %%N in (1,1,!COUNTER!) do echo ROW%%N is: !ROW%%N!
endlocal
pause
 

 
{Добавлено позже}
Если пустые строки нужны:

Код:
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /f "usebackq tokens=1* delims=[]" %%A in (`^<"TechInfo.txt" find /n /v ""`) do (
    set /a COUNTER=%%A
    set "ROW%%A=%%B"
)
for /l %%N in (1,1,!COUNTER!) do echo. ROW%%N is: !ROW%%N!
endlocal
pause
 


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

Всего записей: 2388 | Зарегистр. 12-10-2006 | Отправлено: 11:16 08-07-2018 | Исправлено: BorlandIMHO, 11:39 08-07-2018
Furee



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

Всего записей: 766 | Зарегистр. 13-10-2014 | Отправлено: 13:33 08-07-2018
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Furee
В первом варианте - никак. "setlocal ENABLEDELAYEDEXPANSION" изменяет как раз обработку восклицательного знака.
Во втором варианте можно:

Код:
@echo off
for /f "usebackq tokens=1* delims=[]" %%A in (`^<"TechInfo.txt" find /n /v ""`) do (
    set /a COUNTER=%%A
    set "ROW%%A=%%B"
)
setlocal ENABLEDELAYEDEXPANSION
for /l %%N in (1,1,%COUNTER%) do echo. ROW%%N is: !ROW%%N!
endlocal
pause  

Но спецсимволы %<> всё равно будут обрабатываться как спецсимволы и корёжить вывод...
Это обойти уже не получится или получится только через очень большую ( | )...

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

Всего записей: 2388 | Зарегистр. 12-10-2006 | Отправлено: 14:52 08-07-2018
Eternal07



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день,
имеется кучка файлов вида "00007856.log", нужно выбрать из них определенные и дописать к названию ".old". Если же ".old" уже дописано, то нужно его удалить. Как это можно сделать одним скриптом?
Заранее благодарю за ответ.

Всего записей: 101 | Зарегистр. 21-12-2007 | Отправлено: 15:20 08-07-2018
BorlandIMHO

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

Цитата:
выбрать из них определенные

Если телепатически - задача решения не имеет.
Критерии отбора какие?

Цитата:
Если же ".old" уже дописано, то нужно его удалить

Удаление всех файлов с расширением .old в текущей папке - проще простого:

Код:
del /f /q *.old


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

Всего записей: 2388 | Зарегистр. 12-10-2006 | Отправлено: 16:44 08-07-2018
Eternal07



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

Всего записей: 101 | Зарегистр. 21-12-2007 | Отправлено: 17:12 08-07-2018 | Исправлено: Eternal07, 19:21 08-07-2018
Furee



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

Цитата:
Во втором варианте можно:


Цитата:
Но спецсимволы %<> всё равно будут обрабатываться как спецсимволы и корёжить вывод...  Это обойти уже не получится или получится только через очень большую ( | )...

Еще раз большое спасибо!
Но к сожалению так и не передаются (!). А вот, к стати это наверно странно, некоторые остальные символы все таки передаются в переменную !ROW%%N!. Пока еще точно не разобрался какие именно и при каком расположении этих символов в строке, но точно вижу, что передаются.
Простите за наглость и безграмотность в этом вопросе, но еще такой вопрос: а можно ли как-то передавать строки из ткст.файла в переменную поочередно одну за другой?  
Например: взял стр.№1 -> вставил в переменную -> выполнилась команда с переменной (содержимое стр.№1) -> вернулся в файл -> взял строку№2 -> вставил в переменную -> выполнилась команда с переменной (содержимое стр.№2) -> и т.д. (или это оно уже так и есть?)
Может тогда получится организовать проверку взятой строки какими-то условиями и подставить где надо ^, чтоб спец.символы %<>\/| тоже передавались в переменную...
А то, как я понимаю, получается, что цикл for /L передает все "гамузом" в переменную !ROW%%N!, которая потом уже используется в команде, на которую фактически нельзя повлиять пока не отработает все от 1 до ... В принципе, такой же практически эффект получается от:

Код:
for /f "tokens=*" %%A in ('type file.txt') do echo. "%%A"

только "в тихую".

Всего записей: 766 | Зарегистр. 13-10-2014 | Отправлено: 20:20 09-07-2018
BorlandIMHO

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

Цитата:
к сожалению так и не передаются (!)




С остальными спецсимволами - да, проблемы, но все "!" на месте.
Причём проблемы возникают именно при выводе переменных командой echo, которая эти спецсимволы отрабатывает как командные...

Цитата:
взял стр.№1 -> вставил в переменную -> выполнилась команда с переменной (содержимое стр.№1) -> вернулся в файл -> взял строку№2 -> вставил в переменную -> выполнилась команда с переменной (содержимое стр.№2) -> и т.д. (или это оно уже так и есть?)

 Собственно, именно так работает for /f. Берётся строка из файла (либо из консольного вывода какой-либо команды), разбирается согласно указанным в команде параметрам и далее над разобранным выполняется указанное после "do" (одна команда или целый блок). Потом цикл повторяется со следующей строкой и так до конца файла (либо выхода из цикла другим способом).
 
Поставленную вами задачу "присвоить переменным с порядковыми номерами согласно номерам строк в текстовом файле содержимое этих строк" код
Код:
for /f "tokens=1* delims=[]" %%a in ('^<"textfile.txt" find /n /v ""') do (set "row%%a=%%b")
решает корректно.
 
Другой вопрос - что с этими переменными планируется делать дальше...  
Если тупо вывести на экран "как есть" в том же порядке - то непонятно, нафига  вообще огород городить. Достаточно просто воспользоваться командой type...
Заэкранировать спецсимволы для обеспечения корректного вывода командой echo - в принципе можно, но очень геморройно, и мне, честно сказать, ОЧЕНЬ лень этим заниматься.
 

Цитата:
цикл for /L передает все "гамузом"

Этот цикл ничего никуда не "передаёт". Он тупо перебирает цифирки (счётчик).
При выполнении вместо  "ROW%%N" подставляются ROW1, ROW2 ... , а вместо "!ROW%%N!" соответственно значения ROW1, ROW2 ...
 

Цитата:
такой же практически эффект получается от:
Код:
for /f "tokens=*" %%A in ('type file.txt') do echo. "%%A"

Данная команда выводит ровно то же, что и просто "type file.txt", но for при выполнении "съедает" пустые строки.

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

Всего записей: 2388 | Зарегистр. 12-10-2006 | Отправлено: 22:18 09-07-2018
Eternal07



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

Цитата:
Если телепатически - задача решения не имеет.  
Критерии отбора какие?  

Перефразирую:
есть папка "D:\logs" со множеством файлов, нужно проверить наличие в ней файлов 00008431.log, 00005135.log, 00009874.log. Если эти файлы присутствуют - нужно их переименовать, изменив расширение с .log на .old (00008431.log -> 00008431.old и т.д.). Если же эти файлы уже переименованы и в папке лежат 00008431.old и т.д. То нужно вернуть им расширение .log; удалив .old (00008431.old -> 00008431.log).  
Это можно сделать легко двумя скриптами, один проверяет наличие .log и переименовывает в .old, а другой обратно. Но интересна реализация одним скриптом, а сам не могу понять как это сделать.
upd: в идеале будет: файлы 008431.Log и т.д. находятся в папке - выдать запрос аля "хотите их удалить?" y/n. Файлы .log отсутствуют в папке, выдать запрос "Хотите их восстановить?"y/n. Но я хз, можно ли это осуществить.
 

Всего записей: 101 | Зарегистр. 21-12-2007 | Отправлено: 00:01 10-07-2018 | Исправлено: Eternal07, 00:19 10-07-2018
Furee



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

Цитата:
С остальными спецсимволами - да, проблемы, но все "!" на месте.

Я понял Вас. Ок. Перепроверю что я не так сделал.

Цитата:
Собственно, именно так работает for /f.  Берётся строка из файла (либо из консольного вывода какой-либо команды), разбирается согласно указанным в команде параметрам и далее над разобранным выполняется указанное после "do"

Скорее всего я не верно выразился. Я имел в виду, что цикл for /f сначала именно разбирает весь заданный файл "на органы", что в случае большого количества строк (например журнал весом 100 и более мб) создает нехилую задержку в начале выполнения, а потом уже передается в счетчик for /L.  
Но я уже так понимаю, что скорее всего избежать этого не удастся ибо по другому средствами сmd этого и не добиться. Скрипту все равно придется разобрать файл чтоб понять сколько там строк.

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

Не а, этого было бы не достаточно. Из каждой строки берется кусок (определенное значение) и подставляется в команду и, если команда выполнилась не корректно, значит взятое значение оказалось неправильным либо не правильно передалось. И вот именно тут мне здорово помог Ваш счетчик строк, который помимо передачи переменной в команду еще вел запись выполнения, а мне нужно было знать из какой именно строки было взято неправильное значение.

Цитата:
Заэкранировать спецсимволы для обеспечения корректного вывода командой echo - в принципе можно, но очень геморройно, и мне, честно сказать, ОЧЕНЬ лень этим заниматься.

Это уже не нужно. Обошел другими средствами. Спасибо еще раз, за то что Вы уже здорово помогли мне.
 

Всего записей: 766 | Зарегистр. 13-10-2014 | Отправлено: 01:50 10-07-2018
Abs62



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

Код:
@echo off
for %%i in (00008431 00005135 00009874) do (
  if exist "D:\logs\%%i.log" (
    ren "D:\logs\%%i.log" "%%i.old"
  ) else (
    if exist "D:\logs\%%i.old" (
      ren "D:\logs\%%i.old" "%%i.log"
    )
  )
)

Как-то так. Допилить по вкусу.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 09:20 10-07-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 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Закладки » Сценарии для Windows


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru