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

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

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

vu1tur (29-07-2011 12:47): Задачи на bat-файлах 11
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:53 09-01-2011 | Исправлено: mazafakermazafaka, 11:22 04-06-2011
    Karbid87



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM, спасибо вам огромное. Но можно сделать так, чтобы можно было ввести только четырехзначное число? Если знаков в числе не 4, то выдавалось бы сообщение, что ввод неточный и повторите попытку ввода и сразу ниже опять Enter value. Ну в случае введения пустого значения и введения буквы также. А так всё замечательно работает уже сейчас. Но хотелось бы допилить немного.

    Всего записей: 397 | Зарегистр. 29-01-2011 | Отправлено: 17:55 01-07-2011 | Исправлено: Karbid87, 17:57 01-07-2011
    01MDM



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

    Код:
     
    @echo off
    setlocal
     
    set "key=null"
     
    :again
    set /p key="Enter value: "
    echo .%key%. | 1>nul findstr "\<\.[0-9][0-9][0-9][0-9]\.\>" || goto:again
     
    .....
     



    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 18:06 01-07-2011 | Исправлено: 01MDM, 18:11 01-07-2011
    Karbid87



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM, огромное преогромное Вам спасибо. Всё работает отлично и как задумано было.

    Всего записей: 397 | Зарегистр. 29-01-2011 | Отправлено: 18:10 01-07-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Karbid87
    Еще раз посмотри, немного исправил на случай ввода вида "qwerty 1234"


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 18:12 01-07-2011
    Karbid87



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM, в случае введения текста и через пробел четырех чисел и вправду создавал такую ветку, но пустую и не затирает старую ветку. Всё я увидел, что вы просто исправили своё сообщение. Еще раз спасибо огромное.

    Всего записей: 397 | Зарегистр. 29-01-2011 | Отправлено: 18:17 01-07-2011 | Исправлено: Karbid87, 18:28 01-07-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Karbid87
    Вопрос в том чтобы случайно не ввели некорректное значение. Попробуй проверять так:
     

    Код:
     
    @echo off
    setlocal
     
    set "key=null"
     
    :again
    set /p key="Enter value: "
    echo %time%%key%%time% | 1>nul findstr "\<%time%[0-9][0-9][0-9][0-9]%time%\>" || goto:again
     



    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 18:33 01-07-2011 | Исправлено: 01MDM, 18:38 01-07-2011
    Karbid87



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

    Всего записей: 397 | Зарегистр. 29-01-2011 | Отправлено: 18:36 01-07-2011 | Исправлено: Karbid87, 18:42 01-07-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Karbid87
    Это я про "echo .%key%."
    Например введут "1234." и будет неверная переменная (с точкой), вопрос в задании условия для проверки, чтобы нельзя было его случайно повторить. Вариант с "%time%%key%%time%" вроде отрабатывает как следует


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 18:44 01-07-2011
    Karbid87



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM, вы снова правы. Вариант "1234." со старым кодом прошел удачно. Создалась ветка "1234." затерев старую. Новый вариант не создает при таком значении (просто просит ввести заново).  
    Премного благодарен, что потратили время на решение моей проблемы.

    Всего записей: 397 | Зарегистр. 29-01-2011 | Отправлено: 18:47 01-07-2011
    NIKZZZZ



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

    Цитата:
    можно было ввести только четырехзначное число?

     

    Код:
    @Echo off
     
    :again
    set /p Test="Enter value: "  
     
    Set TestDigit=%Test%
    Set TestDigit=%TestDigit:1=0%
    Set TestDigit=%TestDigit:2=0%
    Set TestDigit=%TestDigit:3=0%
    Set TestDigit=%TestDigit:4=0%
    Set TestDigit=%TestDigit:5=0%
    Set TestDigit=%TestDigit:6=0%
    Set TestDigit=%TestDigit:7=0%
    Set TestDigit=%TestDigit:8=0%
    Set TestDigit=%TestDigit:9=0%
     
    If not "%TestDigit%"=="0000" goto:again
    Echo Ok  


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 19:05 01-07-2011
    Karbid87



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ, спасибо и вам, но мне уже помогли.
    P.S. Ваш код длинноват всё-таки.

    Всего записей: 397 | Зарегистр. 29-01-2011 | Отправлено: 19:20 01-07-2011 | Исправлено: Karbid87, 19:20 01-07-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ,
    Забыл про этот способ. Можно его немного сократить:

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
     
    set "key=null"
     
    :again
    set /p key="Enter value: "
     
    set "test=%key%"
    for /l %%i in (1,1,9) do set "test=!test:%%i=0!"
    if not "%test%"=="0000" goto:again
    echo %key%
     



    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 19:24 01-07-2011
    Karbid87



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

    Всего записей: 397 | Зарегистр. 29-01-2011 | Отправлено: 19:32 01-07-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Karbid87
    Видимо полностью универсального способа нет. Но батник в этом случае просто вылетает и ничего не делает.


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 19:46 01-07-2011 | Исправлено: 01MDM, 19:47 01-07-2011
    Karbid87



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

    Всего записей: 397 | Зарегистр. 29-01-2011 | Отправлено: 20:02 01-07-2011
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Karbid87
    держи для коллекции ещё такой вариант:

    Код:
    @echo off
     
    :again
    set /p key="Enter value 1000-9999: "
    set /a key = %key%  
    if errorlevel 1 goto:again
    if %key% lss 1000 goto:again
    if %key% geq 10000 goto:again
    echo %key%
     

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 07:44 02-07-2011 | Исправлено: wolf0425, 15:43 02-07-2011
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    несколькими месяцами ранее я задавался вопросом можно ли с помощью батника создавать ярлыки, просматривать zip-архивы и тому подобным. у меня были наработки по теме, но я тогда я их отправил в стол, а ныне, разбирая старые записи, у меня все четче вырисовывался план, согласно которому можно обыграть некоторые ограничения командных сценариев, скрестив их с cscript, тем самым унифицировав систему администрирования: ведь многие не спешат использовать PowerShell в виду того, что многим он представляется довольно сложным в освоении (хотя это не так), да и не всегда имеется возможность использовать сторонние утилиты вроде sed или tail, имитацию - правда весьма урезанную, - можно представить в виде сценариев cscript. но давайте перейдем от слов к делу. что я предлагаю? те, кто ни разу не работал с cscript'ом, возможно будут несколько озадачены, увидев батник, например, такого содержания:
    Код:
    @set @script=1 /*
       @echo off
          set @script=
          cscript //nologo //e:jscript "%~dpnx0" %*
       exit /b
    */
    WScript.echo("Это сценарий cscript вызванный из батника.");
    здесь все довольно-таки просто: командный интерпретатор может корректно перемалоть сценарий начиная со второй по пятую строку, чем он и занимается, попутно скармливая себя интерпретатору cscript, для которого в свою очередь все за знаком /* является комментарием. стоит также заметить, что вывод echo команды перестает быть головной болью переключения на люсиду и набором chcp 1251 - набранный текст будет корректно отображаться в консоли. в общем, если что непонятно, то просьба справляться с msdn, а я же приведу еще пару примеров.
    так мы можем создавать ярлыки:
    Код:
    @set @script=1 /*
      @echo off
        set @script=
        cscript //nologo //e:jscript "%~dpnx0" %*
      exit /b
    */
     
    var wsh, desktop, shortcut;
     
    wsh = WScript.CreateObject("WScript.Shell");
    desktop = wsh.SpecialFolders("Desktop");
    shortcut = wsh.CreateShortcut(desktop + "\\" + "Notepad.lnk");
    shortcut.TargetPath = "C:\\WINDOWS\\notepad.exe";
    shortcut.Description = "MS Блокнот";
    shortcut.Save();
    или же просматривать содержимое zip-архивов:
    Код:
    @set @script=1 /*
      @echo off
        set @script=
        cscript //nologo //e:jscript "%~dpnx0" %*
      exit /b
    */
     
    arcname = WScript.Arguments.Item(0);
     
    function ZipView(arcname) {
      var app, fso, fName, items, file;
     
      app = new ActiveXObject("Shell.Application");
      fso = new ActiveXObject("Scripting.FileSystemObject");
     
      try {
        fName = fso.GetFile(arcname).Path;
        items = new Enumerator(app.Namespace(fName).Items());
     
        for (; !items.atEnd(); items.moveNext()) {
          file = items.item();
          WScript.echo(file.Path + " - " + file.Type);
        }
      }
      catch (e) {
        WScript.echo("Ошибка: " + e.message);
      }
    }
     
    ZipView(arcname);
    а вывод списка жестких дисков таким образом становится еще проще, чем через wmic:
    Код:
    @set @script=1 /*
      @echo off
        set @script=
        cscript //nologo //e:jscript "%~dpnx0" %*
      exit /b
    */
     
    function GetDriveList() {
      var fso, enm, drv;
     
      fso = new ActiveXObject("Scripting.FileSystemObject");
      enm = new Enumerator(fso.Drives);
     
      for (; !enm.atEnd(); enm.moveNext()) {
        drv = enm.item();
     
        if (drv.DriveType == 2) {
          WScript.echo(drv.DriveLetter + ":\\");
        }
      }
    }
     
    GetDriveList();

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 22:09 02-07-2011
    Free_Soft



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ComradG
    Здорово. Вопрос только: как это впихнуть к примеру в основной код, т.е. когда после сценария cscript должен пойти еще код основного батника?

    ----------
    На вашей перфокартѣ обнаруженъ вирусъ, механизмъ будетъ остановленъ.

    Всего записей: 1536 | Зарегистр. 19-04-2010 | Отправлено: 22:23 02-07-2011
    ComradG



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

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 22:37 02-07-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ComradG
    Гибриды уже обсуждались например здесь.


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 22:41 02-07-2011
       

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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 10
    vu1tur (29-07-2011 12:47): Задачи на bat-файлах 11


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru