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

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



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

    Цитата:
    как с помощью батника создать ярлык?

    Стандартными средствами, по моему не возможно, пытался это сделать. Проще использовать внешнюю прогу, типа nircmd, либо сгенерить батником маленький VBS скрипт, выполнить его  и удалить.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 17:07 29-05-2010 | Исправлено: NIKZZZZ, 17:09 29-05-2010
    01MDM



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

    Цитата:
    хотелось бы все ручками.

    Не знаю, пошукай на предмет примеров с rundll32, оно может вызвать диалог "мастер нового ярлыка".

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 17:13 29-05-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Кстати, совсем забыл.
    us0r
    В конце своего батника не забудь удалить переменные. Напомню, что оное нужно, если после выполнения батника сессия в командной строке не должна быть окончена. Также напоминаю как это делается:
    set имя_переменной=
     
    Добавлено:
    NIKZZZZ
    Спасибо, идея мне нравится!
     
    01MDM

    Цитата:
    Не знаю, пошукай на предмет примеров с rundll32, оно может вызвать диалог "мастер нового ярлыка".

    Да ты гений! Спасибо!

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 17:16 29-05-2010
    01MDM



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

    Цитата:
    В конце своего батника не забудь удалить переменные.

    Если в начале батника стоит `setlocal`, то это явно лишнее. Setlocal ограничивает видимость переменных контекстом батника. Попробуй выполнить из консоли батник:

    Код:
     
    @echo off
    set test_0=1
    setlocal
    set test_1=1
     

    а потом выполни в консоли:

    Код:
     
    set test_
     

    Переменная %test_1% не существует  

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 17:20 29-05-2010 | Исправлено: 01MDM, 17:26 29-05-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я знаю, просто лишних проверок, а в данном случае удалений, не бывает NIKZZZZ, слушай, (я все по поводу идеи с ярлыком), а ты пробовал как-то рулить темой посредством wmic или нет? 01MDM Пока что у меня получилось вызвать гуишного мастера из командной строки.

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 17:29 29-05-2010
    01MDM



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

    Цитата:
    а ты пробовал как-то рулить темой посредством wmic или нет?

    Может это и реально, если обращаться непосредственно к определенному классу, но во всяком случае псевдонимы fsdir и datafile такой возможности не прeдставляют:

    Код:
     
    wmic fsdir create /?
    wmic datafile create /?
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 17:42 29-05-2010
    us0r



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем благодарю.
    А насчёт ярлыка- а передать параметры функции вызывающий GUI-шный инсталлер никак?
     
    Добавлено:
    Подробнее...

    Всего записей: 406 | Зарегистр. 06-12-2007 | Отправлено: 18:15 29-05-2010 | Исправлено: us0r, 18:47 29-05-2010
    01MDM



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

    Цитата:
    Не отабатывает вторая и последняя строка.  

    У меня все отрабатывает. Какая версия виндовс?
     

    Цитата:
    Кстати косяк- если не вводить ничего и сразу нажать ВВОД, то получим %answer% = y

    Так и задумано. Значение "Y" по умолчанию.
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 19:05 29-05-2010
    SLIDER999

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Знатоки, вот что получилось в итоге: Теперь нужно сделать автоответ через Х секунд

    Цитата:
    @echo off
    TITLE Џ®¦ «г©бв , Ї®¤®¦¤ЁвҐ!
     
    ::Воспроизведение звука
    
    cls
    ping -n 2 127.0.0.1 >Nul
    
    cls
     
    ::Автоответ ДА
    set "answer=y"
     
    otNET
    reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\777
    cls
    if %ERRORLEVEL%==1 goto Office
    echo.
    echo. …б«Ё б®Ј« б-л б ў®Їа®б®¬ Ї®¤вўҐа¦¤ ©вҐ, - ¦ ў ENTER
    echo. ‚ ®бв «м-ле б«гз пе Ўг¤Ґв ®вўҐв Ќ…’
    echo.
    echo.
    set /p answer="•®вЁвҐ гбв -®ўЁвм .NET Framework? "
    if /i "%answer%"=="y" (
    goto:Office
    ) else (
    reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\777 /f
    )
     
    ffice
    reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\888
    cls
    if %ERRORLEVEL%==1 goto EOF
    echo.
    echo. …б«Ё б®Ј« б-л б ў®Їа®б®¬ Ї®¤вўҐа¦¤ ©вҐ, - ¦ ў ENTER
    echo. ‚ ®бв «м-ле б«гз пе Ўг¤Ґв ®вўҐв Ќ…’
    echo.
    echo.
    set /p answer="•®вЁвҐ гбв -®ўЁвм MS Office 2007? "
    if /i "%answer%"=="y" (
    goto:EOF
    ) else (
    reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\888 /f
    )
     
     

     
    П.С.
    конструкция

    Цитата:
    1>nul chcp 1251    
    setlocal
    не работает - кравазябры все равно отображаются, поэтому пользуюсь привычным методом - перевожу в ОЕМ

    Всего записей: 261 | Зарегистр. 16-03-2005 | Отправлено: 20:22 29-05-2010 | Исправлено: SLIDER999, 20:56 29-05-2010
    01MDM



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

    Цитата:
    не работает - кравазябры все равно отображаются,

    Какой шрифт в консоли? Хоть мне и не нравится штатный Lucida Console, использую Consolas, но он спасет.

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 20:33 29-05-2010
    SLIDER999

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    этот батник будет запускаться из cmdlines, поэтому все по-умолчанию

    Всего записей: 261 | Зарегистр. 16-03-2005 | Отправлено: 20:57 29-05-2010
    01MDM



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

    Цитата:
    этот батник будет запускаться из cmdlines

    Это что за зверь? Сценарий для установки? Тогда конечно лучше сохранять в OEM.

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 21:59 29-05-2010
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    по сабжу ярлыка
    если удастся в cli "скрестить" filename.ext и %USERPROFILE%\SendTo\*.DeskLink (там мудрено - не через assoc/ftype , а через реестр; мне пока не удавалось)
     
    Добавлено:
    mbku14

    Цитата:
    А где взять sed?

    sed - мощный текстовый фильтр/процессор с поддержкой регулярных выражений
    p.s. regular expressions

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 07:37 30-05-2010 | Исправлено: mugil_cephalus, 09:12 30-05-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SLIDER999
    Я так понимаю у тебя проблемы с отображением русского шрифта при установленной локали 866? Чувак! это просто решается: берешь FAR, жмешь Shift+F4 (создание нового файла), вбиваешь имя будущего батника (с расширением, разумеется), клацаешь по пимпе Ентр. Далее откроется окно редактора, в котором переключаешь кодировку по F8 в досовскую и валяй текст хоть на супостатском аглицком, хоть на великом и могучем. После чего сохраняешь свое творение по F2. Выход из редактора по эскейпу. У всех, кому я советовал, подобное работает, и даже более того - у всех отпала нужда дрюкаться с кодировками
    mugil_cephalus
    Относительно реестра - подобная мысль меня также посещала, ну хотя бы потому, что в Classes имеется запись о файлах с расширением .lnk Также я подумал вот о чем: в сущности файл .lnk - это текстовый документ с несовсем адекватной кодировкой, в котором прописаны пути до бинарика >)
    01MDM
    Похоже, что через rundll32.exe можно вызвать только гуишного мастера что не есть гуд. А попытки создать ярлык через wmic также терпят фиаско. Ты был прав!)
     
    Единственное, что прокатывает на данный момент - это генератор vbs-ки, следующего содержания (это только пример):

    Код:
     
    Dim WSHShell, fs
       Set WSHShell = WScript.CreateObject("WScript.Shell")
       Set fs = WScript.CreateObject("Scripting.FileSystemObject")
    Function MakeDesktopShortcut( name, target )
      Dim Shortcut,DesktopPath,StartupPath
      DesktopPath = WSHShell.SpecialFolders("Desktop")
      Set Shortcut = WSHShell.CreateShortcut(DesktopPath & "\" & name & ".lnk")
      Shortcut.TargetPath = target
      StartupPath = fs.GetParentFolderName( target )
    If fs.FolderExists( StartupPath ) then
      Shortcut.WorkingDirectory = StartupPath
    End If
      Shortcut.Save
    End Function
    MakeDesktopShortcut "Cool Shortcut", "C:\Program Files\CoolSoft\-CoolProg.exe"
     

    с последующим исполнением оного, но, во-первых, генерация и последуюющее исполнение оной vbs-ки требует прилично времени, во-вторых...
    Слуууушайте, а если попробовать поступить так:
    1)Вручную создаем ярлык в папке с программой;
    2)Открываем его с помощью текстового редактора и копируем содержимое в буффер;
    3)С помощью команды echo пытаемся выввести инфо из буффера в файл .lnk

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

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

    Цитата:
    Слуууушайте, а если попробовать поступить так:  
    1)Вручную создаем ярлык в папке с программой;  
    2)Открываем его с помощью текстового редактора и копируем содержимое в буффер;  
    3)С помощью команды echo пытаемся выввести инфо из буффера в файл .lnk

    Не получится, ярлык это бинарный файл.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 17:55 30-05-2010
    cluster

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

    Цитата:
    Слуууушайте, а если попробовать поступить так:

    Мои мысли читаешь))
    Только нифига через текстовый редактор не получится. Нужно копировать hex и вставлять hex.

    Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 17:57 30-05-2010
    us0r



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

    Цитата:
    У меня все отрабатывает. Какая версия виндовс?

    XP SP3

    Цитата:
    Чувак! это просто решается: берешь FAR

    TrueWay! Yeah!
    С тем же успехом чапаем в блокнот шрифт-terminal (или берём заменители блокнота способные сохранить то, что надо в 866 локали) и не паримся... При желании @echo SomeText >> disk:\path\somefile.txt никто не отменял.
    SLIDER999
    Риальне, консоль тебя спасёт- получишь +1 к навыку "Шоманскай бубен". Как вариант- замена блокноту или в шапке- линка на перекодировщик.

    Всего записей: 406 | Зарегистр. 06-12-2007 | Отправлено: 18:58 30-05-2010 | Исправлено: us0r, 19:00 30-05-2010
    ComradG



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

    Цитата:
    Только нифига через текстовый редактор не получится. Нужно копировать hex и вставлять hex.

    Я это уже понял, но

    Цитата:
    это бинарный файл

    не совсем верно. Бинарики - это одно, а вот линки, это всего лишь набор сведений о путях до бинарика как токового (я не выпендриваюсь, просто перечитай Wininternals Руссиновича, кажись самое первое издание).
    Попытка создать линк через

    Код:
     
    rundll32.exe appwiz.cpl,NewLinkHere [имя_линка(с полным путем)] имя_бинарика
     

    также высаживает на измену.
    Еще мысль относительно сознания линков из командной строке было подсмотреть как это реализуется в NirCmd.exe По предварительному осмотру - там лишь Си да WinAPI. Короче, если тема не закрыта, то временно прикрыта (чтоб не засорять топик одними догадками).
    us0r
    А вам товарищ я бы советовал не выпендриваться: раз такой кулхацкер, чего ж не навалял батник сам? Короче, учи аглицкий (true way пишется все же раздельно) и не сори порожняком.
    P.S.

    Цитата:
    У меня все отрабатывает. Какая версия виндовс?

    Версия XPюши роли не играет: изменений в командный шелл мелкософт с третьим сервис паком не вносила.

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 20:19 30-05-2010
    01MDM



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

    Цитата:
     
    1>nul chcp 1251
    1>nul pause
     

    Паузы нет? Кодировка не меняется? Что-то не верится.

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 21:14 30-05-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    И напоследок немного о ярлыках (немного не по теме)...
     
    В одном из постов выше я упомянал о PowerShell, но тогда это касалось сравнения файлов. В данном же случае речь идет о ярлыках. Всем хорошо известен факт, что в своей работе PowerShell опирается на классы .NET Framework'а. Я тут покумекал и пришел к следующему выводу, если использовать класс System.Environment в купе с методом GetFolderPath, можно создать ярлык где угодно. Например,я хочу создать ярлык в меню "Пуск":

    Код:
    $linkPath = [Sysem.Environment]::GetFolderPath("StartMenu")

    Теперь нужно создать экземпляр объекта (в PowerShell это .Net или COM):

    Код:
    $objShell = New-Object -comObject Wscript.Shell

    для того, чтобы можно было сгенерировать линк:

    Код:
    $objLink = $objShell.CreateShortcut($linkShell + "\MyLink.lnk"

    Дальше указываем ярлыку где искать бинарик:

    Код:
    $objLink.Target = "C:\Program Files\MyProg\MyBin.exe"

    Сохраняем все:

    Код:
    $objLink.Save()

    Вот, собственно, и все.
    В командной строке подобное проворачивается только лишь с помощью VBS или JS скриптов. Увы, но похоже, что тема исчерпана и ее можно закрывать.

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 21:17 30-05-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