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

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



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

Цитата:
естественно он не работает т.к ему нужна кодировка chcp 866, просьба помочь скрипту находясь в кодировке utf-8 (chcp 65001) уметь парсить вывод в кодировке 866

Сделать нужную часть скрипта в кодировке 866 (включив CHCP 866).
А зачем вообще в этом скрипте UTF8? Это только часть скрипта?


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

Всего записей: 3392 | Зарегистр. 09-02-2003 | Отправлено: 16:51 14-01-2019
redson



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

Цитата:
А зачем вообще в этом скрипте UTF8? Это только часть скрипта?

да это только одна часть большого скрипта

Всего записей: 1340 | Зарегистр. 23-04-2007 | Отправлено: 16:55 14-01-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
redson
Попробуйте перед парсингом включить CHCP 866, потом переключить CHCP 65001. Каждая часть скрипта, естественно, должна быть в своей кодировке (переключиться в редакторе на 866, ввести текст, переключиться обратно, если редактор с ума не сойдёт).  


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

Всего записей: 3392 | Зарегистр. 09-02-2003 | Отправлено: 17:51 14-01-2019
boss911



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно проверить, батник запущен с ключом /param=value или без него. Так же, в командной строке запуска батника могут быть и другие параметры, в которых знак "=" отсутствует. Название ключей строго так, как в моем примере.

Код:
FOR %%I IN (%*) DO (
  IF /I "%%I"=="/param=value" SET "param"="/param=value"
  IF /I "%%I"=="/param2" SET "param2=/param2"
  IF /I "%%I"=="/param3" SET "param3=/param3"
)
 
ECHO %param%
ECHO %param2%
ECHO %param3%

Проблема только с IF /I "%%I"=="/param=value", так как в данному случае, внутри цикла съедается знак "=" из-за чего условие становится не верным. То есть, для эксперимента менял "=" на "+" и все работает как надо. Пробовал так:

Код:
FOR %%I IN (%*) DO (
  ECHO %%I | FINDSTR /I /L /C:"/param=value" >nul && SET "param"="/param=value"

но при поиске, внутри слова все равно внутри цикла съедает знак "=". Если FINDSTR вывести из-под цикла:

Код:
ECHO %* | FINDSTR /I /L /C:"/param=value" >nul && SET "param"="/param=value"

то работает как надо. Но FINDSTR мне не нравится тем, что искомое "/param=value" будет правдой, даже если батник будет запущен с ключом /param=value123, что в моем случае неверный ключ, надежность проверки ключа становится низкой, не нравится мне такой метод.
 
Есть решение? Желательно упрощенный и без применения меток. Спасибо.

Всего записей: 3731 | Зарегистр. 29-01-2005 | Отправлено: 02:03 15-01-2019 | Исправлено: boss911, 02:08 15-01-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, boss911
Обычно это делают через loop с shift.

Код:
 
:loop
IF /I "%~1"=="/param=value" SET "param"="/param=value"  
IF /I "%~1"=="/param2" SET "param2=/param2"  
IF /I "%~1"=="/param3" SET "param3=/param3"
shift
if not "%~1"=="" goto :loop
 

Если не может быть кавычек - то убрать /l и добавить пробелы в /c.

Код:
 
ECHO. %* | FINDSTR /I /C:" /param=value " && SET "param=/param=value"
ECHO. %* | FINDSTR /I /C:" /param2 "  && SET "param2=/param2"
ECHO. %* | FINDSTR /I /C:" /param3 "  && SET "param3"=/param3"
ECHO %param%  
ECHO %param2%  
ECHO %param3%
 

Можно попробовать заменить кавычки на пробелы и загнать в кавычки для экрана спецсимволов

Код:
 
set "inparam= %* "
set "inparam=%inparam:"= %"
ECHO. "%inparam%" | FINDSTR /I /C:" /param=value " && SET "param=/param=value"
ECHO. "%inparam%" | FINDSTR /I /C:" /param2 "  && SET "param2=/param2"
ECHO. "%inparam%" | FINDSTR /I /C:" /param3 "  && SET "param3"=/param3"
 

Всего записей: 1902 | Зарегистр. 07-08-2002 | Отправлено: 03:36 15-01-2019
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
boss911
"=" - разделитель параметров в комстроке. Соответственно, задача неразрешима.

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

Всего записей: 4113 | Зарегистр. 18-04-2005 | Отправлено: 07:59 15-01-2019
YuS_2



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

Цитата:
"=" - разделитель параметров в комстроке. Соответственно, задача неразрешима.

run.bat

Код:
@echo off
echo.[%~1]
echo.[%~2]
echo.[%~3]
echo.
if "%~1"=="/p=tt" echo.YES! - param1
echo.
for /f "usebackq tokens=1-3" %%a in ('%*') do (
    if "%%~a"=="/p=tt" echo.YES! - param1 in for
    echo."%%~b"
    echo."%%~c"
)
pause

запуск:

Код:
run.bat "/p=tt" 2 3
или через костыль:
run.bat /p^^=tt 2 3
 

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 08:49 15-01-2019 | Исправлено: YuS_2, 09:06 15-01-2019
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Цель-то - передавать аргумент вида /имя=значение. Соответственно, извраты с кавычками и эскейпированием априори неприемлемы.

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

Всего записей: 4113 | Зарегистр. 18-04-2005 | Отправлено: 12:07 15-01-2019
YuS_2



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

Цитата:
априори неприемлемы

Домысливание - плохая черта в программировании ведь. Нигде не увидел в условии, что применение кавычек неприемлемо, всего лишь:
 15-01-2019

Цитата:
Нужно проверить, батник запущен с ключом /param=value или без него.

А вот тут уже и надо было сказать, что если надо, то по правилам синтаксиса cmd, возможно использование  только с кавычками, а не:
 15-01-2019

Цитата:
задача неразрешима

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

Код:
@echo off
for /f "usebackq tokens=1-3" %%a in ('"%*"') do (
    if "%%~a"=="/p=tt" echo.YES! - param1 in for
    echo."%%~b"
    echo."%%~c"
)
pause

а если смущают кавычки, избавиться от них легко:

Код:
@echo off
for /f "usebackq tokens=1-3" %%a in ('"%*"') do (
    set "var1=%%~a"
    set "var2=%%~b"
    set "var3=%%~c"
)
set "var1=%var1:"=%"
set "var2=%var2:"=%"
set "var3=%var3:"=%"
echo [%var1%]
echo [%var2%]
echo [%var3%]
echo.
if "%var1%"=="/p=tt" echo.YES! - param1 in for
pause

и запускай себе на здоровье без кавычек ... нет? Не решаемая?

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:05 15-01-2019 | Исправлено: YuS_2, 16:43 15-01-2019
EstellaMadl



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго дня всем!
У меня пользователи хранят файлы и переписку в публичной папке x:\pub. У каждого своя подпапка внутри x:\pub.
Была задача удалять устаревшие файлы, если они больше 5 Мб. Файл считается устаревшим после 30 дней.
Не сильна в скриптах, но для такого удаления я написала следующий код:  

Код:
 
set pubhome=x:\pub
set size5mb=5242880
set isbegin=del
forfiles /p %pubhome% /m *.* /s /d -30 /c "cmd /c if @fsize GTR %size5mb% %isbegin% @path /q"
 

 
Все прекрасно работает.
Теперь дали новое задание. Оказывается, часть пользователей возмутилась, что пропадают очень нужные им файлы.
Мол, что они периодичски просматривают письма и перечитывают некоторые файлы, а приложенных файлов нет!
Ну ясно - нет. Прошло 30 дней.
 
В новом задании надо отслеживать не дату создания файла, а дату последнего доступа к файлу.
И если 30 дней файл ни кто ни открывал для чтения, то только тогда можно его удалять.
 
Подскажите, пожалуйста.
Возможно ли решение этой задачи с помощью forfiles или надо задействовать какие-то другие команды?
Заранее благодарна за ответ.

Всего записей: 21 | Зарегистр. 09-12-2016 | Отправлено: 15:16 15-01-2019 | Исправлено: EstellaMadl, 15:34 15-01-2019
YuS_2



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

Цитата:
Возможно ли решение этой задачи с помощью forfiles или надо задействовать какие-то другие команды?

forfiles работает с датой последнего изменения.
Посмотрите в сторону команды dir, с ключом:

Код:
  /T          Выбор поля времени для сортировки.
  время       C  Создание.
              A  Последнее использование.
              W  Последнее изменение.

используйте цикл for... но это несколько нетривиально, т.к. придется даты приводить к единому формату, а в cmd это на раз не делается, лучше воспользоваться powershell...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 16:55 15-01-2019 | Исправлено: YuS_2, 17:01 15-01-2019
EstellaMadl



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да. Попробовла команду dir /T:A
Дату последнего использования видно. Дата у большенства файлов соответствует времени ежедневной антивирусной проверки.
Похоже, что для решения данной задачи придётся убирать ежедневную антивирусную проверку.
Это конечно не очень хорошо. Хотя, при записи файлы, уже были проверены, значит можно отключить.
YuS_2, если не затруднит, дайте пример как работать с циклом dir /T:A
 
И вы говорите лучше воспользоваться powershell я его вообще не знаю.

Всего записей: 21 | Зарегистр. 09-12-2016 | Отправлено: 17:38 15-01-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, EstellaMadl
Оффтопик - скрип на VBS. Сохранить с расширением vbs. Подробнее... Сейчас - только пишет возле себя список файлов для удаления. Для того, чтобы удалял - уберите апостроф перед "oFile.Delete(true)"
На bat - будет сложно сделать. Хотя если устроит не 30 дней, а то же число прошлого месяца -  сейчас додумаю - допишу. Или просто - не менее 28 дней. Чтобы не заморачиваться с длиной месяца.
Как-то так +-2 дня

Всего записей: 1902 | Зарегистр. 07-08-2002 | Отправлено: 18:45 15-01-2019 | Исправлено: Alex_Piggy, 19:16 15-01-2019
YuS_2



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

Цитата:
если не затруднит, дайте пример как работать с циклом dir /T:A  

к сожалению, поспешил я Вас обнадежить и зря. В cmd, с помощью dir, можно получить либо дату создания, либо дату изменения файлов:

Код:
dir name.ext /tc
dir name.ext /tw

а вот, вместо даты доступа, dir отображает, всё таки, дату последнего изменения файла:

Код:
dir name.ext /ta

Вот так получается:

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

Код:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
параметр:
NtfsDisableLastAccessUpdate

или использовать такую команду:

Код:
fsutil behavior set disablelastaccess 0

после чего, перезагрузить систему...
но даже после этих действий, в чистом cmd получить дату доступа не получится, придется привлекать внешние средства либо средства wsh, либо таки powershell...
Мне больше нравится powershell.
Вот как может выглядеть скрипт на нем:

Код:
$fld = 'd:\test'
dir $fld -rec -file -force|?{$_.lastaccesstime -lt (get-date).adddays(-30)}|del -rec -force

как-то так. Просто? Имхо, да. Вот поэтому совсем не хочется ломать голову над тем, как же извратиться в cmd и получить то, что требуется... уж очень ограниченные у него возможности.
 
Добавлено:
Alex_Piggy

Цитата:
На bat - будет сложно сделать.

Если только привлечь WMIC, наверное... лучше уж vbs - понадежнее будет...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:12 15-01-2019 | Исправлено: YuS_2, 20:02 15-01-2019
Deoptimizer

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно использовать cmd для перезаписи в бинарный файл данных по смещению.
 
Знаю есть утилита dd:

Код:
dd bs=1 seek=14256 count=374 if=данные.bin of=выход.bin

 
Но мне нужно это реализовать исключительно через штатные средства WinPE - т.е. batch или VBScript или может есть еще что-то?

Всего записей: 315 | Зарегистр. 12-06-2015 | Отправлено: 19:33 15-01-2019
EstellaMadl



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Понятно.
Alex_Piggy оба решения очень хороши. Огромное Спасибо!
 
YuS_2

Код:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem  
NtfsDisableLastAccessUpdate

Такого ключа нет. Хотя дата последнего доступа отображается...
Понимаю, что его надо добавить. Какое значение надо установить?
REG_DWORD 1
Да?

Всего записей: 21 | Зарегистр. 09-12-2016 | Отправлено: 19:36 15-01-2019 | Исправлено: EstellaMadl, 19:38 15-01-2019
GCRaistlin



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

Цитата:
Домысливание - плохая черта в программировании ведь

Это еще кто домысливает. Вам пишут, что хотят проверить наличие /param=value в комстроке, а вы предлагаете решение для "/param=value" - т. е. как раз домысливаете, что автору вопроса все равно, окавыченной эту строку передавать или нет.
 

Цитата:
И если уж на то пошло и так буквально подходить к вопросу, то можно ведь и так сделать:

Запустите этот workaround с параметром /p="foo&bar" и посмотрите на результат.


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

Всего записей: 4113 | Зарегистр. 18-04-2005 | Отправлено: 19:42 15-01-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, Deoptimizer
В любом случае смотрите в сторону ADODB.Stream.  
Заменить 10 байт начиная с 30 в файле 3.txt на 10 первые байт из файла 2.txt. Сохранить в 3.txt.patched
 
EstellaMadl
В bat я уверен намного меньше. И больше погрешность по времени. Или PowerShell или VBS.

Всего записей: 1902 | Зарегистр. 07-08-2002 | Отправлено: 20:01 15-01-2019 | Исправлено: Alex_Piggy, 20:01 15-01-2019
YuS_2



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

Цитата:
Запустите этот workaround с параметром /p="foo&bar" и посмотрите на результат.

Ты непоследователен...
Вот же ты сам пишешь, что якобы я домысливаю, а на самом деле:

Цитата:
что хотят проверить наличие /param=value в комстроке

и тут же, не отходя от кассы, впендюриваешь свою фантазию:

Цитата:
Запустите этот workaround с параметром /p="foo&bar"

кавычки, да ещё и амперсанд... это что?
"а если этим дыроколом да по башке!?"©Курьер
 
Научись признавать свои ошибки и жизнь покажется более простой... не заморачивайся так.
 
Добавлено:
EstellaMadl

Цитата:
Понимаю, что его надо добавить. Какое значение надо установить?  
REG_DWORD 1  
Да?

1 - это отключено обновление даты
0 - включено
В общем, из консоли, запущенной от имени админа:

Код:
fsutil behavior set disablelastaccess 0

включает обновление последнего времени доступа к файлам...
соответственно:

Код:
fsutil behavior set disablelastaccess 1

- выключает (по умолчанию)
 
Проверить текущее состояние:

Код:
fsutil behavior query disablelastaccess

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:08 15-01-2019 | Исправлено: YuS_2, 20:49 15-01-2019
GCRaistlin



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

Цитата:
кавычки, да ещё и амперсанд... это что?

Это произвольное значение параметра. Его можно указать в комстроке? Можно. Работать с вашим вариантом будет? Нет. Значит, ваш вариант неуниверсален, а вы про это ни слова не написали.
 

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

Я и не заморачиваюсь. Это вы лезете в бутылку.

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

Всего записей: 4113 | Зарегистр. 18-04-2005 | Отправлено: 20:25 15-01-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