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

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

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

vu1tur (27-04-2007 11:55): продолжаем в теме «Задачи на bat-файлах 3»  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 16:59 14-11-2006 | Исправлено: Elroir, 04:30 26-04-2007
    NIKZZZZ



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

    Цитата:
    как можно определить количество знаков в переменной с помощью bat.

    Можно воспользоваться и сторонними средствами, например WSH.
     

    Код:
    echo off
    set Str=Test string
    echo Set Args = WScript.Arguments > StrLen.vbs
    echo WScript.StdOut.Write Len(Args(0)) >> StrLen.vbs
    for /F  %%i in ('CScript.exe StrLen.vbs "%Str%"') do set Result=%%i
    del StrLen.vbs
    echo  "%Str%"
    echo Result - %result%
    pause

     
    К стати, это удобно для более сложных задач обработки текста или вычислений. Например, замена в строке.  

    Код:
    echo off
    echo Set Args = WScript.Arguments > Replace.vbs
    echo WScript.StdOut.Write Replace(Args(0),Args(1),Args(2)) >> Replace.vbs
    for /F  %%i in ('CScript.exe Replace.vbs "%1" "%2" "%3"') do set Result=%%i
    del Replace.vbs
    echo  "%1" "%2" "%3"
    echo Result - %result%


    Цитата:
    А есть где почитать про вот эту строчку size=%%~za?

    Почитать можно "Встроенный справочник по командам" в шапке в разделе For.
     
     
     
     
     
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:42 08-04-2007 | Исправлено: NIKZZZZ, 13:43 08-04-2007
    Elroir



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

    Цитата:
    echo  "%1" "%2" "%3"

    Ты бы хоть написал, что передается в качестве аргументов

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 13:50 08-04-2007 | Исправлено: Elroir, 13:50 08-04-2007
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Приношу извинения:
    %1 - исходная строка
    %2 - что менять
    %3 - на что
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 14:30 08-04-2007
    Smitis



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Возвращаясь к теме "гибридных" скриптов (напоминаю, это когда в одном файле находятся скрипты на более чем одном скриптовом языке).
    Вот несколько примеров с использованием разных скриптовых языков. Все примеры "чистые", т.е. cmd-часть скрипта не выводит эхо команд и сообщений об ошибках.
     
    1. Объединение CMD+JS. Пример HYBRID_CMD_JS.CMD:

    Код:
     
    @set @x=0 /*
    @echo off
    echo This is CMD-part of script
    cscript /nologo /e:javascript "%~f0" %*
    goto:eof
    */
    WScript.Echo("This is JS-part of script")
     

    Этот способ выглядит лучше, чем предлагавшийся несколько страниц назад.
     
    2. Объединение CMD+Perl. Это вообще классика. В ActivePerl есть даже командный файл для пребразования perl -> bat. Пример HYBRID_CMD_PERL.CMD:

    Код:
     
    @rem='
    @echo off
    echo This is CMD-part of script
    s:\perl\bin\perl "%~f0" %*
    goto:eof&rem';
    print "This is PERL-part of script";
     

     
    3. Объединение CMD+KiXtart.
    Метод 1. Метод будет работать со всеми версиями KiXtart. Пример HYBRID_CMD_KIX_1.CMD:

    Код:
     
    ;@echo off
    ;echo This is CMD-part of script
    ;kix32 "%~f0"
    ;goto:eof
    "This is KIX-part of script"
     

     
    Метод 2. Будет работать с новыми версиями KiXtart, поддерживающими многострочные коментарии. Пример HYBRID_CMD_KIX_2.CMD:

    Код:
     
    :rem /*
    @echo off
    echo This is CMD-part of script
    kix32 "%~f0"
    goto:eof
    */
    "This is KIX-part of script"
     

     
    Более подробно объединение CMD+KIX я описал в соответствующей теме на форуме.
     
    4. Объединение CMD+AutoIt. Делается по аналогии с KiXtart. Пример HYBRID_CMD_AUTOIT.CMD:

    Код:
     
    ;@echo off
    ;echo This is CMD-part of script
    ;autoit3 "%~f0" %*
    ;goto:eof
    msgbox(0,"Message","This is AutoIt-part of script")
     

     
    У кого есть примеры для других языков - пишите.


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

    Всего записей: 3452 | Зарегистр. 09-02-2003 | Отправлено: 15:07 08-04-2007 | Исправлено: Smitis, 15:27 08-04-2007
    netman



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот накропал скриптик для перемепа уже подмепленных дисков для систем 2k-xp.
    Смотрит если меп на сервер ,если есть перемепливает на другой на туже букву.
    Мож кому пригодится как мне.
    Предложения по тюнингу принимаются. Только плиз без сторонних языков.Задача такая.
    Да если не сложно у кого мож под рукой подкиньте аналог на английской винде вот этого пути
    c:\windows\ГЛАВНО~1\ПРОГРА~1\АВТОЗА~1\

    Код:
     
    @echo off
    IF "%1" == "" GOTO :ERR
    IF "%2" == "" GOTO :ERR  
    IF %OS%==Windows_NT set key=/persistent:yes
    IF exist c:\windows\ГЛАВНО~1\ПРОГРА~1\АВТОЗА~1\null set bat=c:\windows\ГЛАВНО~1\ПРОГРА~1\АВТОЗА~1
    IF exist d:\windows\ГЛАВНО~1\ПРОГРА~1\АВТОЗА~1\null set bat=d:\windows\ГЛАВНО~1\ПРОГРА~1\АВТОЗА~1
    IF exist e:\windows\ГЛАВНО~1\ПРОГРА~1\АВТОЗА~1\null set bat=e:\windows\ГЛАВНО~1\ПРОГРА~1\АВТОЗА~1
    IF %OS%==Windows_NT set bat=%windir%\system32
    set newshare=%bat%\newshare.bat
    set source=%bat%\list_share.txt
    net use >%source%
     
    set oldserver=%1
    set newserver=%2
     
    setlocal
    echo ::%oldserver%>%newshare%
    for %%a in (%newshare%) do set "size=%%~za"
    set /a "size=size-4"
    set /a "size2=size+3"
    echo ::%size% >%newshare%
     
     
    echo ::Переменные заданы %oldserver% %newserver% >> %newshare%
     
     SetLocal enabledelayedexpansion  
    for /F "eol=T tokens=1,2,3 skip=6 delims= " %%a in (%source%) DO (
    set status=%%a
    set status1=!status!
    set letter=%%b
    set letter1=!letter!
    set server=%%c
    set server1=!server:~2,%size%!
    echo ::"!letter!","%oldserver%","!server1:~0,%size%!","\\%newserver%\!server:~%size2%,10!">>%newshare%
     
    IF /i "%oldserver%" EQU "!server1:~0,%size%!" echo net use !letter! /del /y >>%newshare%  
    IF /i "%oldserver%" EQU "!server1:~0,%size%!"  echo net use !letter! "\\%newserver%\!server:~%size2%,100!" %key% >>%newshare%
                        )      
    endlocal
     
    call %newshare%
    IF %OS%==Windows_NT del %newshare%
     
    @echo ***********************************************************
    @echo *                                                         *
    @echo *         Программа завершила все операции!!              *
    @echo * Проверьте правильность переключения ресурсов с сервера: *
    @echo *          %oldserver% на новый сервер %newserver%            
    @echo *   При появлении ошибок обратитесь к администраторам     *
    @echo *                                                         *
    @echo ***********************************************************
    pause
    goto END
     
    :ERR
    @echo **********************************************************
    @echo *                                                        *
    @echo *         Не передан параметр в программу!!!             *
    @echo * Парамеры запуска newmap [старый сервер] [новый сервер] *
    @echo *           Пример:newmap server1 server2                 *
    @echo *                                                        *
    @echo **********************************************************
    pause
    :END
     
     

    Всего записей: 308 | Зарегистр. 22-09-2003 | Отправлено: 16:32 08-04-2007 | Исправлено: netman, 14:42 09-04-2007
    Elroir



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

    Цитата:
    Да если не сложно у кого мож под рукой подкиньте аналог на английской винде вот этого пути c:\windows\ГЛАВНО~1\ПРОГРА~1\АВТОЗА~1\

    Дай полный (длинный) путь, а то не понятно, что это за директория.
     
    Добавлено:
    Sorry, все равно не смогу помочь - не сообразил сразу, что речь идет о директории Windows 9X.  
     
    P.S. Ты уверен, что данный батник работает/будет работать в Win98?

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 17:30 08-04-2007 | Исправлено: Elroir, 17:38 08-04-2007
    netman



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

    Всего записей: 308 | Зарегистр. 22-09-2003 | Отправлено: 17:42 08-04-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    netman
    Не понял ответа. Ты же написал, что
    Цитата:
    скриптик для перемепа уже подмепленных дисков для систем w98-xp


    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 17:50 08-04-2007
    netman



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    ну нет под рукой 98,просто думаю что вывод net use такой же.Вот и написал
    завтра проверю.

    Всего записей: 308 | Зарегистр. 22-09-2003 | Отправлено: 23:35 08-04-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    netman
    Дело даже не в выводе net use, а в том, что командная строка Win98, IMHO, не поддерживает синтаксис команд, которые ты используешь (setlocal .., for /f ... и т.д.).

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 00:13 09-04-2007
    NIKZZZZ



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

    Цитата:
    Возвращаясь к теме "гибридных" скриптов

    Попробовал создать гибрит на VBS. Не получилось. CScript.exe не желает воспринимать .bat как .vbs. Может у кого-нибудь есть идеи?
     
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 00:21 09-04-2007
    euheny



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Если из контексного меню выполнять команду , то %L - буква диска.
    Откуда это ? Опять я что-то недосмотрел ? ( по идее %~d1 )
    Может кто знает , можно ли в контексном меню создать вложения без длл ?

    Всего записей: 4176 | Зарегистр. 22-11-2006 | Отправлено: 05:43 09-04-2007
    netman



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

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

    Вот это облом,тогда будет работать только на w2k-xp Ну ладно у меня GPO и так на них не аплаится  Хотя обидно,может можно как-то проапгрейдить 98? Или проще уже на vbs перейти,да поставить wbscript????

    Всего записей: 308 | Зарегистр. 22-09-2003 | Отправлено: 08:04 09-04-2007
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    netman
    98..... как давно это было
    попробуй запихать в %path% 9x cmd.exe и, если надо wscript.exe и cscript.exe
    может сработает
     
    Добавлено:
    ну, если это обломно можно попробовать \..cmd сценарий

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 08:43 09-04-2007
    Maza Faka



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

    Цитата:
    как можно определить количество знаков в переменной с помощью bat

     
    Elroir

    Цитата:
    @echo off  

    Код:
     
    setlocal  
    set "test=abra kadabra 1234567890"  
    echo %test%>%temp%\sz.tmp  
    for %%a in (%temp%\sz.tmp) do set "size=%%~za"  
    del /q %temp%\sz.tmp 2>nul  
    set /a "size=size-2"  
    echo %size%

     

     
    Как я понял, нужно было вывести сумму символов в переменной? Но вышеуказанный код, просто отнимает 2 от размера файла "sz.tmp", а не показывает кол-во символов в переменной или я чего-то не понял?
     
     
     
    Добавлено:
    euheny

    Цитата:
    Если из контексного меню выполнять команду , то %L - буква диска.  
    Откуда это ? Опять я что-то недосмотрел ? ( по идее %~d1 )  
    Может кто знает , можно ли в контексном меню создать вложения без длл ?

     
    Ты о чём? Обьясни подробнее...

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 09:01 09-04-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Спасибо за подсказку. Правда у Вас там была ошибочка (nircmdc cmdwait 100) , но идею я понял. Сделал так и все заработало:
    Код:
    start /b nircmdc infobox "INFO" "Title"
    set /a i=100
    :_1
    tasklist | find /i "nircmdc">nul || EXIT
    set /a i-=1
    nircmdc wait 100
    if not %i%==0 goto _1
    nircmdc killprocess nircmdc
    EXIT
    Еще раз спасибо!

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 09:50 09-04-2007
    Elroir



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

    Цитата:
    CScript.exe не желает воспринимать .bat как .vbs

    Ему надо явно указать, какой "движок" использовать:

    Код:
     
    cscript //E:VBScript test.bat
     

    Maza Faka

    Цитата:
    Но вышеуказанный код, просто отнимает 2 от размера файла "sz.tmp", а не показывает кол-во символов в переменной или я чего-то не понял?

    Ты не понял . Нужно было найти именно количество символов, а не их сумму. Я вывожу все, что содержится в переменной в файл. Каждый символ - это один байт. Плюс еще два байта - символ новой строки и символ возврата каретки (LF, CR). Соответственно, когда я получаю размер файла в байтах и отнимаю от этого размера 2, я получаю количество символов в переменной.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 10:20 09-04-2007
    NIKZZZZ



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

    Цитата:
    Как я понял, нужно было вывести сумму символов в переменной? Но вышеуказанный код, просто отнимает 2 от размера файла "sz.tmp", а не показывает кол-во символов в переменной или я чего-то не понял?

    Так ведь размер файла и есть длина переменной + 2 символа (CR,LF).
     
    Добавлено:
    Elroir

    Цитата:
    cscript //E:VBScript test.bat  

    Флэш то двойной! спасибо.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 10:43 09-04-2007
    Maza Faka



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

    Цитата:
    Ты не понял . Нужно было найти именно количество символов, а не их сумму. Я вывожу все, что содержится в переменной в файл. Каждый символ - это один байт. Плюс еще два байта - символ новой строки и символ возврата каретки (LF, CR). Соответственно, когда я получаю размер файла в байтах и отнимаю от этого размера 2, я получаю количество символов в переменной.

     
    Всё понятно!
    Только мне приходится отнимать 3, потому, что в конце строки почему-то ставится пробел...

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 12:11 09-04-2007
    snakeemail

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Кто подскажет как сделать такую штуку
     
    Юзер запускает батник - юзеру показывается сообщение с его ИП адресом.

    Всего записей: 4 | Зарегистр. 20-02-2007 | Отправлено: 13:04 09-04-2007
       

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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 2
    vu1tur (27-04-2007 11:55): продолжаем в теме «Задачи на bat-файлах 3»


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru