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

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

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

vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 12:40 25-01-2010 | Исправлено: bomzzz, 13:37 20-08-2010
    mugil_cephalus

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

    Цитата:
    Да, так работает даже в сложных случаях. А можно в двух словах (чисто для понимания): что тут происходит?

    а ты прочитай 2-3 страницы после ссылки , вот до - http://forum.ru-board.com/topic.cgi?forum=62&topic=19668&start=2020#7

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 13:46 08-07-2010
    res2001



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

    Цитата:
    Да, так работает даже в сложных случаях. А можно в двух словах (чисто для понимания): что тут происходит?

    Читай, не читай прояснения не наступит. Один из приколов cmd, имхо.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 14:17 08-07-2010
    mugil_cephalus

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

    Цитата:
    Читай, не читай прояснения не наступит. Один из приколов cmd, имхо.

    вот-вот...

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 14:56 08-07-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Может кто сталкивался с подобным: как показать только необходимые значения реестра из запроса reg query. Лично мне надумалось только это:

    Код:
    @echo off
    setlocal
    for /f "skip=2 tokens=1,2,*" %%i in ('2^>nul reg query^
     hklm\hardware\description\system\centralprocessor\0') do (
      if %%i==ProcessorNameString (
        set proc=%%k
      )
      if %%i==Identifier (
        set idnt=%%k
      )
      if %%i==~MHz (
        set /a tact=%%k
      )
      if %%i==VendorIdentifier (
        set vend=%%k
      )
    )
    echo.
    echo CPU:    %proc%
    echo Extend: %idnt%
    echo MHz:    %tact%
    echo Vendor: %vend%
    endlocal
    exit /b

    Надеюсь не нужно объяснять, что for изначально отбрасывает часть значений вывода reg query, а с помощью оператора if находятся те ключи, которые удовлетворяют запросу.
    Да! Я пытаюсь решить с помощью батника одну, казалось бы простую задачу: вывести на экран консоли список всех .NET-процессов. Ковыряние wmic не принесло никаких результатов. Может я чего пропустил, ткните носом, пожалуйста. А вот на счет того, чтобы из батника использовать PS, идея похоже обречена в зародыше: те кто сидит под XP и Vista особо не парятся с его установкой. Хотя как удобно и просто было бы подобное реализовать с помощью командлета Get-WmiObject. Как итог, я решил провернуть, как кто-то говорил ранее, извращение со встроенными компиляторами самоий .NET:

    Код:
    @echo off
    setlocal
    1>%~dp0app.vb (
    echo Imports System
    echo Imports System.Diagnostics
    echo.
    echo Module NETLister
    echo   Sub Main^(^)
    echo     Dim clr As PerformanceCounterCategory = New PerformanceCounterCategory^(".NET CLR Memory"^)
    echo.
    echo     For Each process As String In clr.GetInstanceNames^(^)
    echo       If ^(process ^<^> "_Global_"^)
    echo         Console.WriteLine^(process^)
    echo       End If
    echo     Next
    echo.
    echo   End Sub
    echo End Module
    )
    %systemroot%\microsoft.net\framework\v2.0.50727\vbc.exe /nologo /t:exe /out:%~dp0app.exe %~dp0app.vb
    start /b %~dp0app.exe
    del /f /q %~dp0app.vb
    endlocal
    exit /b

    По поводу вопросов "А нафига на Васике?" или "А нафига вообще это нужно?" - во-первых, не все ли равно на каком языке, во-вторых, предложите альтернативы, тогда посмотрим. Еще раз повторюсь, что задача состояла втом, чтобы получить список .NET-процессов из самой консоли, а иного способа я пока что не нашел.
    Ну и последняя идея, которая у меня появилась вчера: как в пакетном режиме управлять процессами системы. Пользоваться хромоногим tasklist не очень-то удобно, ровно как и его собратом taskkill. Нужно было чего-то помощнее. Те, кто работал хоть раз в никсах, наверное, знает про ps (не путать с виндовым PowerShell'ом). В системе у меня всегда установлены Debugging Tools, в дистрибутив которой помимо отладчиков входят две крутые тулзы tlist и kill. Вот я и подумал их скрестить:

    Код:
    @echo off
    setlocal
    if /i "%1"=="" goto:help
    if /i "%1"=="/?" goto:help
    if /i "%1"=="/k" goto:kill
    if /i "%1"=="/t" goto:list
    goto:eof
     
    :help
    echo  /t - print task list
    echo  /k - kill process
    goto:eof
     
    :kill
    if "%2"=="" goto:eof
    1>nul "%programfiles%\debugging tools\kill" -f %2
    echo %2 killed.
    goto:eof
     
    :list
    "%programfiles%\debugging tools\tlist" -t
    goto:eof
    endlocal
    exit /b

    Полные установочные пути Debugging Tools по умолчанию я не помню, у меня же они установлены в D:\tools. Так вот, если батник назвать ps, то процессами можно рулить намного быстрее. В общем предложения, брань (если она оправдана) и прочее рассматриваются Кто чего предложит.
    P.S>res2001 я начал разбирать windiws-1251.

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 14:18 09-07-2010
    res2001



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

    Цитата:
    Может кто сталкивался с подобным: как показать только необходимые значения реестра из запроса reg query. Лично мне надумалось только это:

    дык примени reg query ... | findstr "ProcessorNameString Identifier VendorIdentifier"

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 14:30 09-07-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Ну и? Будет искать строки, где встречается ProcessorNameString Identifier VendorIdentifier. А ты читал

    Цитата:
    for изначально отбрасывает часть значений вывода reg query

    То есть в выводе не должны маячить полные пути реестра.
     
    Добавлено:
    А! Дошло!

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 14:33 09-07-2010 | Исправлено: ComradG, 14:35 09-07-2010
    res2001



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

    Цитата:
    А! Дошло!


     
    Добавлено:

    Цитата:
    P.S>res2001 я начал разбирать windiws-1251.

    собственно именно эта кодировка меня не особо волнует я как раз в нее пытаюсь остальные перекодировать.  
    Пока справился только с юникодом, нашел оригинальный способ, встроенными функциями js все замечательно кодируется,  за кои8 не брался еще.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 14:41 09-07-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Эээ! Извини за тормоза, а выводить в переменные как предлагаешь потом?
     
    Добавлено:
    Дык тебе kio8 все-таки нужно разрулить?

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 14:44 09-07-2010
    res2001



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

    Цитата:
    а выводить в переменные как предлагаешь потом?

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

    Код:
    @echo off
    setlocal enabledelayedexpansion
    for /f "tokens=1,2,*" %%i in ('reg query hklm\hardware\description\system\centralprocessor\0 ^| findstr "ProcessorNameString Identifier VendorIdentifier ~MHz"') do (
        set "str=%%i"
        set "str=!str:ProcessorNameString=CPU!
        set "str=!str:VendorIdentifier=Vendor!
        set "str=!str:Identifier=Extend!
        set v=%%k
        if "!str!" equ "~MHz" set "str=MHz" & set /a "v=!v!+1-1"
        echo !str!:    !v!
    )  

    Добавлено: исправил код.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 14:54 09-07-2010 | Исправлено: res2001, 15:00 09-07-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    И ^ не помогает? Хм. Ладно, спасибо, будем думать далее над оптимизацией.
    А, прости! На счет .NET-процессов идеи есть?

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 14:59 09-07-2010
    res2001



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

    Цитата:
    А, прости! На счет .NET-процессов идеи есть?

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

    Цитата:
    Дык тебе kio8 все-таки нужно разрулить?

    нужно кои8 в вин1251. Есть некий скрипт взятый в инете, но выглядит очень криво. Больше ничего не нашел, буду сам делать видимо.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 15:01 09-07-2010
    ComradG



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

    Цитата:
    нету, мне они не интересны на данном этапе

    ОбЫдно. У меня просто куча прог нетовских: XMLNotepad, FileExplorer, FileChecker (последний собственного написания ), - так что мне резон с этим возиться есть. Блин, может mugil_cephalus,wolf0425 или кто тут еще башковитый имеется подскажут чего, только их невидно.
     
    Добавлено:
    На счет koi8 не обещаю, но может быть подмагну.

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 15:11 09-07-2010
    Vanries



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
       Всем здарова.
     У меня вот такая проблемка, переадресовать на исполнение код, написанный в AkelPad'е интерпретатору perl и вывести в окне оболочки PowerShell .
     Эта же самая задача успешно реализована при помощи этого кода:
     

    Код:
     
    -"Execute Perl Code" Exec(`cmd.exe /k %f`, "%d") Icon("C:\Perl\bin\perl5.10.0.exe")
     

    Но как видно из вышеприведённого, с выводом  результатов в окне обычной командной строки.

    Всего записей: 26 | Зарегистр. 28-10-2009 | Отправлено: 16:12 09-07-2010 | Исправлено: Vanries, 16:15 09-07-2010
    lorents



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день!
    У меня есть программа, которая выдает некую информацию о картинке
    convert image.png -format "%A" info:
     
    Will return True or False
     
    Как мне сделать, если я получаю значения True,то выполняется одно действие, если False то другое?

    ----------
    Image Catalyst - оптимизация изображений без потери качества

    Всего записей: 3297 | Зарегистр. 30-12-2007 | Отправлено: 19:51 09-07-2010
    ComradG



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

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 20:05 09-07-2010 | Исправлено: ComradG, 20:05 09-07-2010
    BVV63



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Приветствую всех.
    Помогите, пожалуйста, решить такую задачу. Потребовалось в переменную (ну, или в переменные, не суть) засунуть все актуальные файлы подкачки на сервере. Проблема в том, что параметр реестра "Paging Files" (под ключом [HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management]), описывающий их, имеет формат REG_MULTI_SZ, т. е. строки в его значении разделены парой символов "\0". Помаявшись и ничего не придумав, я решил всё значение запихать в переменную и работать уже с ней. В ней можно отталкиваться от символа(-ов) ":". Но тут потребуется счётчик (хотя бы для того, чтобы вернуться к литере раздела перед ":"). И я не знаю как с ним работать относительно переменной. Попробовал "If %PagingFiles:~%Counter%,1% ...", не хочет так работать. Как можно эту переменную грамотно отпарсить?
     
    Добавлено:
    Или, может можно обойтись без дополнительной переменной и всё же через For вытащить файлы подкачки? У меня не получилось...
     
    Добавлено:
    Ага, можно ведь и от пробелов в переменной отталкиваться, тогда может без счётчика получится. Сейчас попробую... ...Нет, без счётчика не получается...

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 09:45 10-07-2010 | Исправлено: BVV63, 10:10 10-07-2010
    mugil_cephalus

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

    Код:
    setlocal enabledelayedexpansion
    set "cnt=1"
    for /f "tokens=3" %%a in ('reg query "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" /v PagingFiles ^|more +4') do (
    set "PagingFiles!cnt!=%%~a"
    set /a cnt=!cnt!+1
    )
    set PagingFiles
    pause

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 11:11 10-07-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BVV63
    С реестром не работаю, сформулируй попроще задачу. Типа вывод такой то(пример подробный). Если сложно , можно sed ом отпарсить. А вообще, ты вроде задавал этот вопрос?

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 11:18 10-07-2010
    Melhior



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    господа!
    помогите, пожалуйста с кодом. задачка-то вроде простая, но никак у меня не выходит. подозреваю, что я так и не разобрался в скобках-кавычках... но может и нет.
    при запуске батника он проверяет наличие в папке файла с неважно каким именем, но конкретным расширением. если он есть, то его имя передаётся как параметр программке, которая формирует текстовик с некоторой информацией об этом файле. после формирования текстовик открывается, после просмотра и закрытия - удаляется.
    если же этого файла в папке нет - выдаём сообщение об ошибке.
    всё! но вот никак я не могу добиться, чтобы else у меня срабатывало.
    один из вариантов моего кода:

    Код:
    @echo off
    for %%i in (*.XXX) do (if exist %%i ('start /w PROG.EXE %%i') else (echo Error, no *.XXX file was found!))
    start /w PROG_OUTPUT.TXT
    del /q /f PROG_OUTPUT.TXT
    pause

    спасибо!

    Всего записей: 1255 | Зарегистр. 11-01-2004 | Отправлено: 11:43 10-07-2010
    lorents



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    я использую программу Convert (входит в состав ImageMagick)
    если я в командную строку ввожу

    Код:
    C:\convert.exe C:\image.png -format "%A" info:

    но все нормально, мне выдает сообщение True или False в зависимости от картинки.
    Но если я ввожу эту же строку в batch то мне выдает

    Цитата:
    convert.exe: option requires an argument `-format' @ error/convert.c/ConvertImageCommand/1503.

    я если я ввожу в командную строку значение, где в путях файлов есть кириллиц

    Код:
    "C:\Новая папка\convert.exe" "C:\Новая папка\image.png" -format "
    A" info:

    то выдает

    Цитата:
    convert.exe: Improper image header `C:\Новая папка\image.png' @ error/png.c/ReadPNGImage/3078.
    convert.exe: missing an image filename `info:' @ error/convert.c/ConvertImageCommand/2970.

    Почему так?

    ----------
    Image Catalyst - оптимизация изображений без потери качества

    Всего записей: 3297 | Зарегистр. 30-12-2007 | Отправлено: 11:57 10-07-2010 | Исправлено: lorents, 11:57 10-07-2010
       

    Страницы: 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 » Операционные системы » Microsoft Windows » Задачи на bat-файлах 8
    vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru