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

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Спасибо.  
 
Теперь обнаружил, если встречается кириллический текст - он коверкается...

Всего записей: 61 | Зарегистр. 20-09-2005 | Отправлено: 15:01 21-03-2019
Alex_Piggy

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

Цитата:
Теперь обнаружил, если встречается кириллический текст - он коверкается...

Как именно? Чем открываете? Самый простой способ проверить -  
jq . input.json
При выводе в файл кодировка должна стать UTF-8.
Ксатти, еще вариант -  
jq "((.params.DIRECTORY=\"c:\\new test\\\\\") | (.\"Printer Settings\".elements.\"Directory Settings\".elements.DIRECTORY.default=\"c:\\абра\\\\\"))"

Всего записей: 1843 | Зарегистр. 07-08-2002 | Отправлено: 15:06 21-03-2019
toshanNEW



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

Цитата:
Как именно? Чем открываете?

В изначальном файле кодировка Windows1251 (Судя по Lister'у в TotalCMD и Блокноту Windows).
После jq становится UTF-8 и Кириллица становится не читаемой.

Всего записей: 61 | Зарегистр. 20-09-2005 | Отправлено: 17:19 21-03-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
toshanNEW
jq принимает только JSON в UTF-8. Если у Вас в CP1251 - то воспользуйтесь iconv, winiconv. Собранный мной бинарник win_iconv
Тогда получается так:
win_iconv -f CP1251 -t UTF-8 m.json | jq "." | win_iconv -f UTF-8 -t CP1251 > me.json

Всего записей: 1843 | Зарегистр. 07-08-2002 | Отправлено: 18:09 21-03-2019
YuS_2



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

Цитата:
Теперь обнаружил, если встречается кириллический текст - он коверкается...


Цитата:
В изначальном файле кодировка Windows1251 (Судя по Lister'у в TotalCMD и Блокноту Windows).  
После jq становится UTF-8 и Кириллица становится не читаемой.

Попробуйте powershell:
 
script.ps1 - кодировка файла utf8 with BOM, либо 1251

Код:
$filein = '.\in.json'
$fileout = '.\out.json'
$newstring = 'c:\new_test'
 
function set-param {
    process {
        $_.'printer settings'.elements.'Directory Settings'.elements.directory.default = $newstring
        $_.params.directory = $newstring
        write-output $_
    }
}
gc $filein  -enc default| convertfrom-json|set-param|convertto-json -dep 10 -comp| sc $fileout -enc default

 
батник для запуска:
run.bat

Код:
@powershell -ex bypass .\script.ps1
pause&exit /b

Всего записей: 3199 | Зарегистр. 03-02-2009 | Отправлено: 18:28 21-03-2019
toshanNEW



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Это конечно интереснее, не используя сторонние утилиты, но не работает:

Код:
Не удается найти свойство "default" для данного объекта. Убедитесь, что оно существует и его можно задать.
E:\_jq\script.ps1:7 знак:9
+         $_.'printer settings'.elements.'Directory Settings'.elements. ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: ( [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound

Alex_Piggy
Спасибо, так работает.  
Но если в файле не было данного параметра - он создаётся.  
Можно вообще просто найти в .json файле все вхождения с путём и заменить на другой путь?

Всего записей: 61 | Зарегистр. 20-09-2005 | Отправлено: 10:36 26-03-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе  время, toshanNEW
jq "( .. | strings| select (. == \"test\"))|= \"new test\"" in.json
Заменит все строки, равные "test" на "new test"
А внутри select уже ставьте, что нужно - '. == "test"', 'startswith("test")', 'test("te[s]*t","i")'.

Всего записей: 1843 | Зарегистр. 07-08-2002 | Отправлено: 12:46 26-03-2019 | Исправлено: Alex_Piggy, 12:55 26-03-2019
Inoz2000



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


Код:
wmic os get OSArchitecture | find /i "64-bit"
if %ERRORLEVEL% NEQ 0 set 1C_PATH="C:\program files\1cv8\"
if %ERRORLEVEL% EQU 0 set 1C_PATH="C:\program files (x86)\1cv8\"
set 1C_NEWPATH="dir /S %1C_PATH%" | find /i "bin"

  • не слишком удачная идея использовать название переменной, начинающееся с цифры
    %1 это — аргумент командной строки.
  • чтобы записать вывод команды в переменную, воспользуйтесь командой for /f
    например
    wmic os get OSArchitecture | find /i "64-"
    if %ERRORLEVEL% NEQ 0 set C_PATH="C:\program files\1cv8\"
    if %ERRORLEVEL% EQU 0 set C_PATH="C:\program files (x86)\1cv8\"  
    for /f "delims=" %%c in ('dir /S %C_PATH% ^| find /i "bin"') do set 1C_NEWPATH=%%c
     
    и зачем заключать в кавычки dir, если переменную уже задали в кавычках.
    и ещё, ещё… …

  • Всего записей: 3456 | Зарегистр. 23-04-2009 | Отправлено: 18:14 28-03-2019
    newhk



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

    Код:
     
    for /f "delims=" %%c in ('dir /S %C_PATH% ^| find /i "bin"') do set C_NEWPATH=%%c
     

    Выдает:
    Непредвиденное появление: %%c

    Всего записей: 324 | Зарегистр. 02-02-2009 | Отправлено: 19:09 28-03-2019 | Исправлено: newhk, 19:16 28-03-2019
    unreal666



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    newhk
    %%имя_переменной_в_батнике
    %имя_переменной_в_консоли
     
    В батнике имена переменной для for пишутся с двумя %%, а в консоли с одной.

    Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 19:21 28-03-2019 | Исправлено: unreal666, 19:23 28-03-2019
    newhk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо, понял, учту.
    Но, задачу решить пока не смог.
    Можно конечно через вывод в файл, а потом поиск в файле, но это грабли.
    А вообще, идея такая.
    Проверяем, какая разрядность у системы (нужно для дальнейшего определения пути)
    Когда определились, в какой из папок "Program files" лежит 1С-ка, идем дальше.
    Конечная идея, определить версию платформы до папки "bin" и развернуть в полный путь, который запишется в переменную (вот здесь и затыкаюсь).
    Эту задачу в другой ситуации решил с помощью PowerShell.
    Здесь надо через CMD.

    Всего записей: 324 | Зарегистр. 02-02-2009 | Отправлено: 20:01 28-03-2019
    Inoz2000



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

    Цитата:
    Здесь надо через CMD.

    Цитата:
    Проверяем, какая разрядность у системы
    Вызов wmic - это долго
    но сам bat-файл может быть запущен из 64-битной версии cmd.exe или 32-битной,
    поэтому, определить наверняка можно хотя бы так:
    If Defined PROCESSOR_ARCHITEW6432 (Set xOS= (x86^)) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS= (x86)
    set C_PATH="C:\program files%xOS%\1cv8\"

    Цитата:
    определить версию платформы до папки "bin"
    это - не ко мне, я этих ваших 1С не знаю
    ps видеть dir без /b как-то даже непривычно в таких задачах.

    Всего записей: 3456 | Зарегистр. 23-04-2009 | Отправлено: 20:31 28-03-2019
    newhk



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

    Код:
     
    wmic os get OSArchitecture | find /i "64-bit"
    if %ERRORLEVEL% NEQ 0 set C_PATH="C:\program files\1cv8\"
    if %ERRORLEVEL% EQU 0 set C_PATH="C:\program files (x86)\1cv8\"  
    for for /f "delims=" %%c in ('dir /B %C_PATH% ^| find /i "8.3."') do set C_NEWPATH=%%c
     

    Собственно, это часть одного достаточно большого кода для установки софта, выполнения операций над локальными пользователями и т.д.
    Конкретно этот участок нужен был для того, чтобы проверять, установлена ли 1с-ка определенной версии, а если установлена то пропускать установку.
    Спасибо.
     
    Добавлено:

    Цитата:
    ps видеть dir без /b как-то даже непривычно в таких задачах.

    Да, я это уже понял, иначе получается белиберда...

    Всего записей: 324 | Зарегистр. 02-02-2009 | Отправлено: 20:35 28-03-2019
    GCRaistlin



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

    Цитата:
    определить наверняка можно хотя бы так

    Это отнюдь не наверняка, ибо переопределить эту переменную окружения ничего не стоит. Наверняка - вот так:

    Код:
     
    for /f "tokens=3" %%A in ('reg.exe query "HKLM\Hardware\Description\System\CentralProcessor\0" /v Identifier') do if %%A == x86 (echo x86) else echo x64
     

    По мотивам http://stackoverflow.com/questions/12322308/batch-file-to-check-64bit-or-32bit-os

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

    Всего записей: 3075 | Зарегистр. 18-04-2005 | Отправлено: 22:38 28-03-2019
    BorlandIMHO

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

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

    Недавно проскакивало, конкретно про 1С:
    bat файл для установки 1с на разные версии windows  
    Переменная окружения "PROCESSOR_ARCHITECTURE" определяет разрядность ОС при запуске "умолчального" командного процессора cmd.exe (т.е. если не выкобениваться, настраивая под ОС x64 обработку cmd-шников при помощи строго 32-бит cmd.exe).
    Если есть вероятность, что кто-то повыёживался, то после выяснения {"%PROCESSOR_ARCHITECTURE%" == "x86"} нужно бы ещё проверить {If Defined PROCESSOR_ARCHITEW6432} (в вышеприведённом моём примере не реализовано, ибо такие перенастройки для 99,9% "продакшн" систем нехарактерны), дабы убедиться, что имеет место именно не запуск 32-бит командного процессора в x64 среде, а нативный x32.
     
    Несмотря на "говорящие" имена, значения вышеуказанных переменных окружения определяются характеристиками не железа, а именно установленной ОС и конкретно выполняемого экземпляра командного процессора cmd.exe.
    И это правильно: независимо от крутизны ЦП, под системой x32 невозможно выполнение/установка приложений x64. Выполнение же x32 приложений под ОС x64 {в большинстве случаев} возможно, если в самом софте не предусмотрены некие ограничения {типичный пример "ограниченного" софта - SEP 12/SEP14; инсталлятор не позволяет установить x32 клиента на x64 систему независимо от прочих обстоятельств).
     
    Использование wmic для определения разрядности ОС - на мой взгляд - излишне.
     
    Добавлено:
    GCRaistlin

    Цитата:
    переопределить эту переменную окружения ничего не стоит

    При большом желании можно и wmic "обмануть"...
    Нужно всё-таки исходить из предположения, что ни один вменяемый админ переопределением базовых системных переменных окружения заниматься не будет; а "если всё-таки" - то учтёт таковое переопределение при написании/использовании скриптов...

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

    Всего записей: 1240 | Зарегистр. 12-10-2006 | Отправлено: 23:47 28-03-2019 | Исправлено: BorlandIMHO, 23:49 28-03-2019
    GCRaistlin



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

    Цитата:
    Нужно всё-таки исходить из предположения, что ни один вменяемый админ переопределением базовых системных переменных окружения заниматься не будет

    Это плохое предположение. Переменные могут быть изменены и ненарочно. А ошибки потом не доищешься.

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

    Всего записей: 3075 | Зарегистр. 18-04-2005 | Отправлено: 00:12 29-03-2019
    newhk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Тогда, осмелюсь предположить, что самым надежным способом будет проверка наличия папки "C:\Program Files (x86)"
    И по итогам проверки уже задавать переменную.

    Всего записей: 324 | Зарегистр. 02-02-2009 | Отправлено: 08:59 29-03-2019
    Inoz2000



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    если вообще целю всей задачи стоит получение именно переменной, то решение однострочное

    Всего записей: 3456 | Зарегистр. 23-04-2009 | Отправлено: 09:19 29-03-2019
    newhk



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

    Цитата:
    если вообще целю всей задачи стоит получение именно переменной, то решение однострочное

    В принципе, да.
    Подскажете?

    Всего записей: 324 | Зарегистр. 02-02-2009 | Отправлено: 09:30 29-03-2019
    GCRaistlin



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

    Цитата:
    Тогда, осмелюсь предположить, что самым надежным способом будет проверка наличия папки "C:\Program Files (x86)"

    А в чем сложность создать такую папку на x86-системе?

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

    Всего записей: 3075 | Зарегистр. 18-04-2005 | Отправлено: 09:54 29-03-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.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru