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

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

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

KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

hErAx

Редактировать | Цитировать | Сообщить модератору
Задачи на bat-файлах 12
Предыдущие части: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
 
Для перекодирования кирилицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы

 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки
 
Полезные утилиты
 
Готовые решения и частые вопросы:
  • При запуске batch-файла от Администратора текущая директория меняется на system32
  • Встроенный справочник по командам
  • Создание помощи по всем командам консоли 2000 и XP
  • Делаем паузу в командном файле стандартными средствами Windows
  • Альтернативные решения »
  • Работа с текстом, датой, и файлами »
  • Администрирование, автоматизация и сеть »
  • Работа с переменными и параметрами ком. строки »
     
    Описания работы команд и символов участниками темы:
    · setlocal enabledelayedexpansion и переменные окружения
    · символы & и && в командной строке
    · Переменная %0

  • Отправлено: 01:53 25-10-2015 | Исправлено: Paromshick, 21:51 18-12-2017
    YuS_2



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

    Цитата:
    Есть еще

    Этих ещё масса, видимо. Сам пользовался вот такой: https://ritchielawrence.github.io/cmdow/

    Всего записей: 2025 | Зарегистр. 03-02-2009 | Отправлено: 12:29 18-12-2017
    Paromshick



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

    Код:
    CERTUTIL -addstore -enterprise -f -v root CA.cer

    в батнике, запускаемом с повышенными привилегиями.
    Certutil упорно стартует в system32 между тем как юзер может запустить скрипт везде, хоть на рабочем столе, хоть еще где-то. Соответственно, файл CA.cer он не находит, хоть тот лежит в той же папке, что и скрипт. Надо как-то поправить это дело, но не пойму как. Запускаться будет на разных версиях Windows.
    Копировать в папку не предлагайте, не надо

    Всего записей: 1916 | Зарегистр. 12-04-2013 | Отправлено: 19:02 18-12-2017
    sundraw

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Столкнулся с ошибкой в замене текста. Для замены слов в тексте использую такой батник

    Код:
     
    @echo 1. Копирование батников с заменой текста в них  
     
    @echo off
    SetLocal EnableExtensions EnableDelayedExpansion
     
    Set infile=O:\CopyIPtoVM.bat
    Set outFile=O:\IPVM\IPVM1\%%i\CopyIPtoVM.bat
    Set find=8888
    Set replace=%%i
     
    for /L %%i in (1,1,10) do (
    @echo %%i
    for /F "UseBackQ delims=" %%n in ("%infile%") do (  
      set "LINE=%%n"
      echo=!LINE:%find%=%replace%!>>"%outFile%"
    )
    pause
    )
     

     
    Исходник CopyIPtoVM.bat такой

    Код:
     
    @echo off
    setlocal enabledelayedexpansion  
     
        "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 8888 copyto O:\IPVM\IPVM\8888\1.bat C:\Windows\ --username Admin --password 1 --recursive --follow
        if errorlevel 1 (call :loop) else "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 8888 execute --image "C:\Windows\1.bat" --username Admin --password 1
     
    exit /b
     
    :loop
     for /l %%a in (1,1,2) do (
     
    "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 8888 copyto O:\IPVM\IPVM\8888\1.bat C:\Windows\ --username Admin --password 1 --recursive --follow
        if !errorlevel! equ 0 ("C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 8888 execute --image "C:\Windows\1.bat" --username Admin --password 1 &exit /b)
    )
     
    exit /b  
     

     
    В выходном CopyIPtoVM.bat теряется !errorlevel! , который превращается в 0

    Код:
     
    @echo off
    setlocal enabledelayedexpansion  
        "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 copyto O:\IPVM\IPVM\1\1.bat C:\Windows\ --username Admin --password 1 --recursive --follow
        if errorlevel 1 (call :loop) else "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 execute --image "C:\Windows\1.bat" --username Admin --password 1
    exit /b
     
    :loop
     for /l %%a in (1,1,2) do (
    "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 copyto O:\IPVM\IPVM\1\1.bat C:\Windows\ --username Admin --password 1 --recursive --follow
        if 0 equ 0 ("C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 execute --image "C:\Windows\1.bat" --username Admin --password 1 &exit /b)
    )
    exit /b  
     

     
    Ошибка возникает не при копировании, а при чтении и замене текста. Вот !errorlevel! почему-то читается как 0. Как можно устранить ошибку?

    Всего записей: 667 | Зарегистр. 15-05-2011 | Отправлено: 21:14 18-12-2017 | Исправлено: sundraw, 22:37 18-12-2017
    Paromshick



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я сам себе отвечу, может кому-то пригодится...
    Updated
    В результате всенародного обсуждения, несколько постов ниже, родилось следующее
    При запуске пакетника с повышенными привилегиями, то есть от Администратора, он запускается в system32 (во всяком случае, он "забывает" о каталоге своего размещения)
    Вернуть его на путь истинный помогает
    "%~dp0"
    В моём случае получилось
    Код:
    CERTUTIL -addstore -enterprise -f -v root "%~dp0"CA.cer
    Здесь, файл передаваемый утилите Certutil указывается напрямую.
    Если у вас несколько файлов, лежащих в каталоге с пакетным файлом, или по иным соображениям, то можно использовать
    Код:
    @echo off
    pushd "%~dp0"
    rem Контрольный выстрел
    echo %cd%
    <тут команды которые используют файлы в текущем каталоге>
    popd
    pause
    Помня, что
    Код:
    cd /d "%~dp0"

    В начале пакетного файла решит все проблемы, текущим каталогом станет каталог батника, путь к нему можно будет не указывать.
    При этом следует понимать принцип, что
    Цитата:
    А феншуйность такая:
    1) cd /d не поддерживает запуск с UNC-путей;
    2) pushd подключает для этого временный сетевой диск - отключает по popd;
    3) прямое указание пути через %~dp0 - просто работает и все.

    (C) Ru-Board

    Всего записей: 1916 | Зарегистр. 12-04-2013 | Отправлено: 21:42 18-12-2017 | Исправлено: Paromshick, 11:01 19-12-2017
    YuS_2



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

    Цитата:
    Как можно устранить ошибку?

    Это не ошибка, cmd всегда пытается раскрывать переменные.  
    Чтобы обойти этот момент, можно попробовать экранировать спецсимволы:

    Код:
    ^^!errorlevel^^!

     
    Добавлено:
    Paromshick

    Цитата:
    При запуске пакетника с повышенными привилегиями, то есть от Админа, он запускается в system32  
    Вернуть его на путь истинный помогает  

    Это не новость, так уж придумали разработчики... вопрос зачем, оставим за рамками.
    А для перехода в необходимый каталог есть команда CD или PUSHD... ну или абсолютные пути указывать в пакетнике.

    Всего записей: 2025 | Зарегистр. 03-02-2009 | Отправлено: 23:17 18-12-2017
    NIKZZZZ



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sundraw
    Чтобы не мучиться , можно отказаться от проверки !errorlevel!

    Код:
    :loop
     for /l %%a in (1,1,2) do (
    "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 copyto O:\IPVM\IPVM\1\1.bat C:\Windows\ --username Admin --password 1 --recursive --follow && "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 execute --image "C:\Windows\1.bat" --username Admin --password 1 & exit /b
    )
    exit /b  
     
     
     
    Добавлено:
    thejustsoul

    Цитата:
    Добавить cmd нельзя? Почему только bat? По-поводу github, не планируете туда выкладывать?

    В принципе .bat практически не отличается от .cmd , но буду править, добавлю.
    github - нет, не собираюсь.
     

    Всего записей: 4894 | Зарегистр. 08-02-2006 | Отправлено: 01:15 19-12-2017 | Исправлено: NIKZZZZ, 01:19 19-12-2017
    sundraw

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    К сожалению, экранирование не получается, пробовал разные варианты размещения ^^
     
    NIKZZZZ
    А вот Ваш вариант подходит. Только у меня вопрос: получается, что :loop отрабатывает только один раз, а не 2, потом выходит из цикла. А если в конце цикла убрать & exit /b , то он будет отрабатывать все 2 раза без условий. Первый вариант подходит, но не всегда за один раз скрипт отрабатывает. Второй не подходит, будет мешать: одну и ту же команду будет отрабатывать 2 раза. Может, какие другие есть варианты проверки на ошибку после 1-го раза.
    Возникает дилемма - либо копировать батники с заменой строк без !errorlevel! по Вашему варианту, либо делать всё вручную, что нереально для здравого смысла.

    Всего записей: 667 | Зарегистр. 15-05-2011 | Отправлено: 07:19 19-12-2017 | Исправлено: sundraw, 07:41 19-12-2017
    YuS_2



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

    Цитата:
    Может, какие другие есть варианты проверки на ошибку после 1-го раза.

    угу, exit прописать также через двойной амперсанд:

    Код:
    :loop
    for /l %%a in (1,1,2) do (
        ("C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 copyto O:\IPVM\IPVM\1\1.bat C:\Windows\ --username Admin --password 1 --recursive --follow&&"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 execute --image "C:\Windows\1.bat" --username Admin --password 1)&&exit /b
    )
    exit /b

    Всего записей: 2025 | Зарегистр. 03-02-2009 | Отправлено: 07:40 19-12-2017
    sundraw

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    Последний скрипт решил обе проблемы. Спасибо.
    Только хотел уточнить такой момент:
    Скрипт 1

    Код:
     
    :loop
     for /l %%a in (1,1,2) do (
     
    "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 copyto O:\IPVM\IPVM\1\1.bat C:\Windows\ --username Admin --password 1 --recursive --follow
        if !errorlevel! equ 0 ("C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 execute --image "C:\Windows\1.bat" --username Admin --password 1 &exit /b)
    )  
     

    и
    Скрипт2

    Код:
     
    :loop
    for /l %%a in (1,1,2) do (
        ("C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 copyto O:\IPVM\IPVM\1\1.bat C:\Windows\ --username Admin --password 1 --recursive --follow&&"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 execute --image "C:\Windows\1.bat" --username Admin --password 1)&&exit /b
    )  
     

     
    Они полные аналоги?
     

    Всего записей: 667 | Зарегистр. 15-05-2011 | Отправлено: 08:01 19-12-2017
    Paromshick



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

    Цитата:
    А для перехода в необходимый каталог есть команда CD или PUSHD... ну или абсолютные пути указывать в пакетнике.

    Изложите, пожалуйста, как бы выглядел искомый batch.
     
    Условия известны:
    1. Утилита Windows, запускается с запросом повышенных привилегий
    2. Передающейся ей для импорта (или другой обработки) файл, находится в одном каталоге с batch
    3. Путь к самому каталогу неизвестен. Рабочий стол, флешка, времянка... Что угодно. Работает даже из сетевого расположения.
     
    Чем примечателен certutil, так тем, что в enterprise хранилище он без прав админа не импортнёт и даже не попытается. Проверив уровень привилегий, отвалится.
     
    Есть предложения?
     
    PS Напомню. Конкретный рецепт нужен. Клиентов намечается масса, а коммерческий сертификат (файл .cer) я сам пока еще не готов заказать, не до конца определились с именами в нём прописываемыми. Каждый преревыпуск платить... Не айс.
    Вот на тряпочном сертификате станет ясно, что требуется. Но для этого надо его импортировать.

    Всего записей: 1916 | Зарегистр. 12-04-2013 | Отправлено: 08:47 19-12-2017
    sundraw

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    NIKZZZZ
    Спасибо за помощь. С наступающим Новым Годом!

    Всего записей: 667 | Зарегистр. 15-05-2011 | Отправлено: 08:53 19-12-2017
    NIKZZZZ



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sundraw
    Могу предложить еще один гарантированный вариант, т.к. повторений всего 2 , можно вообще отказаться от цикла и блоков.

    Код:
    :loop  
    "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 copyto O:\IPVM\IPVM\1\1.bat C:\Windows\ --username Admin --password 1 --recursive --follow&&"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 execute --image "C:\Windows\1.bat" --username Admin --password 1&&exit /b  
    "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 copyto O:\IPVM\IPVM\1\1.bat C:\Windows\ --username Admin --password 1 --recursive --follow&&"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol 1 execute --image "C:\Windows\1.bat" --username Admin --password 1
    exit /b  


    Всего записей: 4894 | Зарегистр. 08-02-2006 | Отправлено: 09:19 19-12-2017
    YuS_2



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

    Цитата:
    Они полные аналоги?

    Да, я добавил только амперсанд и скобки...
     
    Paromshick

    Цитата:
    как бы выглядел искомый batch.

    pushd /?

    Код:
    @echo off
    pushd "%~dp0"
    rem Контрольный выстрел
    echo %cd%
    <тут команды которые используют файлы в текущем каталоге>
    popd
    pause

    Всего записей: 2025 | Зарегистр. 03-02-2009 | Отправлено: 09:38 19-12-2017
    NIKZZZZ



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

    Цитата:
    2. Передающейся ей для импорта (или другой обработки) файл, находится в одном каталоге с batch  

    Так и добавьте в начало батника

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

    Это решит все проблемы, текущим каталогом станет станет каталог батника, путь к нему можно будет не указывать.
    К стати, ваше утверждение

    Цитата:
    При запуске batch-файла от Администратора текущая директория меняется на system32

    не верно, кто Вам сказал, что запуская батник разными методами текущей директорией обязательно будет каталог батника?
     

    Всего записей: 4894 | Зарегистр. 08-02-2006 | Отправлено: 09:54 19-12-2017
    Paromshick



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    NIKZZZZ
    Хорошо. Скопипастил, for future use
    В чём нефеншуйность уже найденного и весьма краткого
    Код:
    CERTUTIL -addstore -enterprise -f -v root "%~dp0"CA.cer
    Сравнивая, я тупо вижу, что... Не важно. Важно, что именно "тупо". Сравните, если не сложно, сами. Особенно хорошо услышать, что этот код лучше потому, что если. В этих "если" много может быть скрыто. Например, вЫнь ХР какой-нибудь. Бывает еще...
    А так, я вижу, что у меня короче и работает. Тупо.
     
    Добавлено:
    NIKZZZZ

    Код:
    cd /d "%~dp0"
    Нельзя. В начало - нельзя. В текущем каталоге нет самой certutil

    Всего записей: 1916 | Зарегистр. 12-04-2013 | Отправлено: 10:09 19-12-2017
    sundraw

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

    Всего записей: 667 | Зарегистр. 15-05-2011 | Отправлено: 10:10 19-12-2017
    Paromshick



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

    Цитата:
    кто Вам сказал, что запуская батник разными методами текущей директорией обязательно будет каталог батника?

    Пардон, но про разные методы я ничего не говорил. От обратного здесь не применимо.
     
    Добавлено:

    Цитата:
    Условия известны:
    1. Утилита Windows*, запускается с запросом повышенных привилегий
    2. Передающейся ей для импорта (или другой обработки) файл, находится в одном каталоге с batch
    3. Путь к самому каталогу неизвестен. Рабочий стол, флешка, времянка... Что угодно. Работает даже из сетевого расположения.

    *Обычно находятся в %WINDIR%\system32 но никак не в каталоге батча. Простите, это казалось очевидным. Не учёл.
     
    Добавлено:

    Цитата:
    Нельзя. В начало - нельзя. В текущем каталоге нет самой certutil

    Разобрался. В синтаксисе ошибся, в одну строку писал.
    Вопросов, кроме сравнительного анализа на феншуйность не осталось.
    Феншуй - дело вкуса, конечно. Но всё же

    Всего записей: 1916 | Зарегистр. 12-04-2013 | Отправлено: 10:12 19-12-2017
    NIKZZZZ



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

    Цитата:
    В начало - нельзя. В текущем каталоге нет самой certutil

    Если она лежит в %WINDIR%\system32 - можно.

    Всего записей: 4894 | Зарегистр. 08-02-2006 | Отправлено: 10:34 19-12-2017
    Pasha_ZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Paromshick
    А феншуйность такая:
    1) cd /d не поддерживает запуск с UNC-путей;
    2) pushd подключает для этого временный сетевой диск - отключает по popd;
    3) прямое указание пути через %~dp0 - просто работает и все.

    Всего записей: 7088 | Зарегистр. 11-03-2002 | Отправлено: 10:41 19-12-2017
    YuS_2



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

    Цитата:
    Нельзя. В начало - нельзя. В текущем каталоге нет самой certutil


    Цитата:
    *Обычно находятся в %WINDIR%\system32 но никак не в каталоге батча.

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

    Всего записей: 2025 | Зарегистр. 03-02-2009 | Отправлено: 10:47 19-12-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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Активные темы » Задачи на bat-файлах 12
    KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru