Форум программистов, компьютерный форум, киберфорум
Наши страницы

Batch (CMD/BAT)

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 4.00
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
#1

Тонкости языка, редкие команды и сложные скрипты - CMD/BAT

16.10.2012, 06:56. Просмотров 121210. Ответов 92

Тема для пользователей высокого уровня подготовки.

Здесь можете размещать:
  • Ваши статьи;
  • Ссылки на другие статьи (допускаются ссылки на другой форум с указанием авторства, а также на английском языке);
  • Редкие ошибки, выдаваемые интерпретатором, способы их устранения/либо причины возникновения.
  • Недокументированные и особые трюки работы с файловой системой, устройствами и т.п.
  • Разрешено обсуждение выложенных здесь материалов (в последствии будут выделены в отдельную тему);
  • Запрещено обсуждение новичками проблем работы с CMD, где вероятная причина - банальная синтаксическая ошибка.


Статьи и тонкости языка:
Основы
  • FAQ по файлам BAT/CMD (статья) ссылка
  • Командная строка Windows (статья) ссылка
  • Особенности реализации командного процессора cmd.exe операционных систем WinNT (статья) сайт
  • Циклические операции и примеры (статья) эта тема
  • Принцип составления однострочных команд Batch (статья) эта тема
Автозапуск
  • Запуск Bat-файла как службы Эта тема
  • Выполнение командного файла перед входом в систему Эта тема
Безопасность и права
  • Элевация прав запуска BAT-файла (отображается диалог контроля учетных записей UAC) ссылка
  • Как запустить командную строку от имени администратора. эта тема
Интерфейс
  • Переключение языка вывода команд консоли на английский ссылка
КомментарийМатематика
  • Деление с выводом дробной части на батниках ссылка
  • Деление через строковую математику (для делимого, превышающего тип данных signed long int) ссылка
  • Получение 16-ричного представления числа эта тема
  • Получение кода символа по таблице ASCII из числового значения byte эта тема
  • Перевод чисел из десятеричной системы в любую (2-16) эта тема
  • Логические операции сравнения для чисел, превышающих арифметику CMD эта тема
Операционная система, реестр
  • Почему нежелательно запускать BAT из 32-битной среды в 64-разрядной системе. ссылка
  • Функции чтения/записи ключа реестра с отображением уровня ошибки ссылка
Переменные и аргументы
  • Подстановка значения переменной в имя или параметр другой переменной эта тема
  • Перебросить значение через локаль эта тема
  • Часто задаваемые вопросы по использованию аргументов командной строки (статья) сайт
  • Получение рабочего каталога на определенном диске эта тема
  • Undocumented Dynamic variables (недокументированные способы раскрытия переменных среды) эта тема
ПотокиПроцессы
  • Получение PID, имени, пути и параметров запуска процесса эта тема
Связь с другими языками программирования и средами, комбинированные батники

  • -- JScript
  • Скомбинированный файл CMD + JS (WSH) эта тема
  • Выполнение JS кода через mshta.exe эта тема
    -- VBScript
  • Передача значения из BAT-сценария в VBS-скрипт эта тема
  • Метод возврата значения из VBS-скрипта в BAT-сценарий эта тема
  • Получение ErrorLevel из команды CMD в переменную VBS-скрипта тема
    -- Реестровый ключ
  • Способ хранения ключа реестра внутри бат-файла эта тема
    -- Ресурсы внутри BAT-файла
  • Распаковка текстовой информации, заданной меткой в файле CMD, во внешний файл тема
  • Встраивание ресурсов в БАТ-файл тема
    -- Другое:
  • Комбинированный файл CMD + KIXTART
  • Объектно-ориентированное программирование на bat ссылка
Текстовые операции и работа с "массивами"
  • Вывод текста без переноса на новую строку (статья) эта тема
  • Чтение текста из файла без пропуска пустых строк эта тема
  • Экранировать восклицательный знак эта тема
  • Получить последний токен в заданной строке эта тема
  • Урезать в строке справа лишние пробелы или другие подряд идущие символы эта тема
  • Получение символов BackSpace (0x08) и Esc (0x27) в переменную эта тема
  • Функция для работы с массивами эта тема
  • Считывание файла в псевдомассив с учетом пустых строк эта тема
  • Функция правильного выравнивания текста по знакам табуляции эта тема
  • Способ передачи в бат-файл параметра содержащего символы & и последующей обработки полученного значения эта тема
Циклы
  • Подстановка переменной в роле модификатора для цикла эта тема
  • Разбиение строки на токены, если разделитель - кавычка эта тема
Файловые операции
  • Объединить 2 файла (сохранив результаты в одном из них) эта тема
  • Получение информации о размере папки эта тема

References, Special Manuals, Книги для High Level Users:
  • Command-line Reference (Microsoft Tech-Net)
  • Недокументированные и малоизвестные возможности Windows XP (книга)
  • Описание встроенных консольных утилит и команд для различных версий ОС dx21.com CMD-Reference

Баги интерпретатора CMD и встроенных команд
Планируется разместить:
Rem не всегда является командой начала комментария
Создание и удаление точек повторной обработки сайт
.

Если у Вас возникли вопросы, создайте новую тему.
15
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2012, 06:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Тонкости языка, редкие команды и сложные скрипты (CMD/BAT):

После выполнения определённой команды не выполняются последующие команды - CMD/BAT
Объясните, пожалуйста, почему может останавливаться выполнение второй и далее комманд? cd C:\Users\alex_iv\Desktop\test_node\ node...

Тонкости языка С,define - C (Си)
Здравствуйте. Разбираюсь с одной либой для hd44780, есть вопрос по поводу использования define'ов. Вот отрывок: #define GLUE(a,...

Поддерживает ли встроенный сервер PHP скрипты языка Perl? - Perl
В PHP существует встроенный сервер. Создаю файл index.html с формой и файл test.pl для ее обработки. Хотел протестировать на встроенном...

создать програму которая содержит в себе команды обработки строк языка асемблер - Assembler
Создать програму которая содержит в себе команды обработки строк языка асемблер. Выполнить введение строки из 40 символов. Слова в строке...

Редкие программы - Софт
тема и тупая, но в институте задали такой вопрос: какие программы считаются редкими,привести их название... обшарил весь рунет, ниче...

Частые сохранения в SQLite или редкие, но массивные? - Программирование Android
Приветствую, Пишу приложение, являющееся по своей сути онлайн-словарем. Сейчас требуется реализовать функции "избранное" и "история"....

92
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
26.06.2013, 10:06  [ТС] #31
Функции чтения/записи реестра с отображением уровня ошибки
-----------------------------------------------------------------------
Функция записи в реестр :Reg_Write
Проверено в Windows 7 и XP. Не требует DelayedExpansion.

Bash
1
2
3
4
5
6
7
:Reg_Write
  :: %1-вх.Ключ
  :: %2-вх.Имя параметра
  :: %3-вх.Тип параметра { REG_SZ, REG_BINARY, REG_DWORD, REG_QWORD, REG_MULTI_SZ, REG_EXPAND_SZ }
  :: %4-вх.Значение
  reg.exe add "%~1" /v "%~2" /t "%~3" /d "%~4" /f
Exit /B %errorlevel%
Пример использования:

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
@echo off
SetLocal EnableExtensions
 
::Запись
Call :Reg_Write "HKCU\Environment" "MyVariable" "REG_SZ" "12345"
echo Функция вернула уровень ошибки: %errorlevel%
echo.
 
pause
goto :eof


Функция :Reg_Read v.1. (Light)
Проверено в Windows 7 и XP. Не требует DelayedExpansion.

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

Bash
1
2
3
4
5
6
7
8
9
10
:Reg_Read
  :: %1-вх.Ключ
  :: %2-вх.Имя параметра
  :: %3-исх.Переменная для хранения значения
  :: %4-исх.(опционально)-Переменная для хранения типа параметра
  set "%~3="& if "%~4" neq "" set "%~4="
  For /f "tokens=2*" %%a In ('Reg.exe query "%~1" /v "%~2"') do (
    set "%~3=%%~b"& if "%~4" neq "" set "%~4=%%~a"
  )
Exit /B
Функция чтения из реестра :Reg_Read v.1. (Standart)
Выводит уровень ошибки.
Неправильно читает значения, если в имени параметра есть пробел.

Bash
1
2
3
4
5
6
7
8
9
10
:Reg_Read
  :: %1-вх.Ключ
  :: %2-вх.Имя параметра
  :: %3-исх.Переменная для хранения значения
  :: %4-исх.(опционально)-Переменная для хранения типа параметра
  set "%~3="& if "%~4" neq "" set "%~4="
  For /f "tokens=1-2*" %%a In ('cmd /e:ON /v:ON /c "Reg.exe query "%~1" /v "%~2"^& echo ^!errorlevel^! err %~2"') do (
    if "%%b"=="err" (set err=%%a) else (set "%~3=%%~c"& if "%~4" neq "" set "%~4=%%~b")
  )
Exit /B %err%
Пример использования:

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
SetLocal EnableExtensions
 
::Чтение
Call :Reg_Read "HKCU\Environment" "Temp" Value KeyType
echo Значение: %Value%
echo Тип ключа: %KeyType%
echo Функция вернула уровень ошибки: %errorlevel%
echo.
 
pause
goto :eof


Функция чтения из реестра :Reg_Read v.2. (Spaces Safety)
Проверено на Windows 7 и XP.
Требует DelayedExpansion.

Кликните здесь для просмотра всего текста
Bash
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
:Reg_Read
  :: %1-вх.Ключ
  :: %2-вх.Имя параметра
  :: %3-исх.Переменная для хранения значения
  :: %4-исх.(опционально)-Переменная для хранения типа параметра
  set "%~3="& if "%~4" neq "" set "%~4="
  For /f "delims=" %%a In ('cmd /e:ON /v:ON /c "Reg.exe query "%~1" /v "%~2"^& echo ^!errorlevel^!"') do (
    set tok_prev=!err!
    set err=%%a
  )
  if "%err%" neq "0" Exit /B %err%
  ::Подсчитываем кол-во токенов в имени параметра, если оно состоит из пробелов
  set "_param=%~2"
  echo %_param% |>nul find " " && (
    set _toks=0
    set "_param="!_param: =" "!""
    for %%a in (%_param%) do set /A _toks+=1
  ) || set _toks=1
  ::Пропускаем полученное кол-во токенов при разборе вывода Reg Query
  set _k_type=& set _k_value=
  :Reg_Read_tok
  for /f "tokens=1*" %%a in ("%tok_prev%") do (
    if !_toks! LEQ 0 (
      if not defined _k_type (
        set "_k_type=%%~a"
      ) else (
        set "_k_value=!_k_value! %%~a"
      )
    )
    set /A _toks-=1
    set "tok_prev=%%b"
    if "%%b" neq "" goto Reg_Read_tok
  )
  set "%~3=%_k_value:~1%"& if "%~4" neq "" set "%~4=%_k_type%")
Exit /B 0


Пример использования:

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
::Чтение
Call :Reg_Read "HKCU\Environment" "Temp" Value KeyType
echo Значение: %Value%
echo Тип ключа: %KeyType%
echo Функция вернула уровень ошибки: %errorlevel%
echo.
pause
2
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
06.07.2013, 14:47  [ТС] #32
Способ передачи в бат-файл параметра содержащего символы & и последующей обработки полученного значения
от Elroir

Если передавать параметр в кавычках, то передается полностью. Но вот как дальше работать с этой ссылкой в кавычках...
Передаем батнику ссылку в кавычках и делаем так:
Bash
1
2
3
set test=%1 
set test=%test:&=^&% 
echo %test:~1,-1%
2
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
06.07.2013, 15:25  [ТС] #33
Запуск Batch-файла как службы

MSDN Создание определяемой пользователем службы через INSTSRV.EXE
Создание службы Windows с помощью программы Sc.exe
MS TechNet Sc create

1) Создание и запуск службы:

Bash
1
2
3
4
5
6
7
8
@echo off
::Путь к запускаемому бату в роле службы
set src=d:\bat.bat
 
sc create My_Service binPath= %windir%\SysWOW64\srvany.exe DisplayName= "My Service"
reg add "HKLM\SYSTEM\CurrentControlSet\Services\My_Service\Parameters" /f /v Application /t REG_SZ /d "%src%"
net start "My_Service"
pause
2) Остановка и удаление службы:

Bash
1
2
3
4
@echo off
net stop "My_Service"
sc delete "My_Service"
pause
Все операции нужно проводить в режиме повышенных прав.

Пример протестирован в Windows 7 x64.
В ОС Windows XP, Vista, 8 файл srvany.exe отсутствует. Перед созданием службы, его следует скопировать в системную папку. 32-битная версия srvany.exe из состава Windows 7 подходит к указанным версиям ОС.
В ОС Windows Vista, 7, 8 служба запускает скрипт на отдельном рабочем столе.

Windows Resource Kit.

Примечание:
Чтобы задать аргументы запуска, нужно создать в разделе My_Service\Parameters ключ:
"AppParameters"="Some Arguments"
Bash
reg add "HKLM\SYSTEM\CurrentControlSet\Services\My_Service\Parameters" /f /v AppParameters /t REG_SZ /d "Some Arguments"
Можно задать рабочий каталог:
"AppDirectory"="C:\Progra~1"
Bash
reg add "HKLM\SYSTEM\CurrentControlSet\Services\My_Service\Parameters" /f /v AppDirectory /t REG_SZ /d "C:\Progra~1"
Важно, пути с пробелами указывать в формате 8.3.
4
Вложения
Тип файла: rar srvany_x32.rar (3.7 Кб, 66 просмотров)
Smitis
1627 / 336 / 39
Регистрация: 15.10.2012
Сообщений: 529
06.07.2013, 23:57 #34
Выполнение командного файла перед входом в систему
Программа старая, но на Window7 32 работает (проверено). Можно назвать аналогом autoexec.bat для NT-систем.
Некоторые замечания:
- Служба запускается до логина пользователя. Соотвественно, имя пользователя в %USERNAME%, пути к папкам, типа %USERPROFILE%, %APPDATA% и т.п. могут быть отличными, от ожидаемых. Лучше всего посмотреть их, записав вывод команды SET в файл (см. пример далее). Соотвественно, права доступа к ресурсам системы надо смотреть для каждого конкретного случая.
- Консольное окно не открывается, соотвественно, никакого вывода, например, через echo, никакой интерактивности, типа pause, не будет (командный файл просто "зависнет" в ожидании ввода). Даже запуская vbs, простейшее окно через msgbox открыть не удаётся. Но можно записывать на диск в файлы. Впрочем, на старых системах что-то может быть по другому.
- После выполнения autoexnt.bat служба останется запущеной, хотя она уже не нужна. Много ресурсов она не потребляет, но её можно остановить прямо там, из autoexnt.bat.
Пример autoexnt.bat:
Bash
1
2
3
4
5
@echo off
echo %date% %time% > c:\autoexnt.log
set >> c:\autoexnt.log
net stop AutoExNT > nul
exit
3
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
01.08.2013, 15:04  [ТС] #35
Дополнение к коду от m0nkrus и FraidZZ
"Получение N-ной строки из файла"
за авторством aGerman (http://www.dostips.com)

Пример для получения 5-й строки:
Bash
1
2
3
4
5
<test.txt (
  for /l %%i in (1 1 4) do set /p "="
  set /p "st="
)
for /f "tokens=1* delims==" %%i in ("%st%") do set "st=%%j"
2
Charles Kludge
Клюг
7636 / 3151 / 363
Регистрация: 03.05.2011
Сообщений: 8,382
06.08.2013, 21:27 #36
Хитрый SUBST (undoc) - для назначения диска можно использовать не только буквы A-Z, но и цифры 0-9 и символы $,#, :, ! , например:
SUBST $: "%TEMP%
$:

подстановка нe видна ни в эксплорере, ни в ФАРе, ни в самом SUBST'e без параметров, ни по SET . | more. Также работает с шарами Samba на FreeBSD, отмапленными по net use.
5
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
09.08.2013, 01:41  [ТС] #37
Разбиение строки на токены, если разделитель - кавычка
Автор: amel27

Bash
for /f tokens^=1^,2^,3^ delims^=^" %%a in ("1""2""3") do echo %%a--%%b--%%с
3
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
11.08.2013, 20:12  [ТС] #38
Как восстановить удаленные файлы и папки из теневых копий в Windows 8
Статья от Вадима Стеркина - ссылка
2
Charles Kludge
Клюг
7636 / 3151 / 363
Регистрация: 03.05.2011
Сообщений: 8,382
21.08.2013, 23:02 #39
Смена даты/времени модификации (modification/last access date/time) на текущую.
Bash
1
copy/b nul >> FILE.EXT+,,
если закрутить в цикл, получим скрипт-аналог touch.exe
Работает на шарах Самбы.
На FAT-разделах меняет только last write date/time, естественно.
5
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
13.10.2013, 17:54  [ТС] #40
Способ хранения нескольких REG-файлов в теле батника

Используется предварительная распаковка.

Код

Bash
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
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
call :RegKeyExecute SetConsoleColor
pause
 
call :RegKeyExecute SetDefaultKeyboardLayout_EN
pause
exit /B
 
 
:RegKeyExecute [Имя ресурса]
  For /F "tokens=1 delims=[]" %%? in ('find /i /n "%~1 begin" ^< "%~f0"') do set LineFrom=%%?& set /A LineFrom+=1
  For /F "tokens=1 delims=[]" %%? in ('find /i /n "%~1 end" ^< "%~f0"') do set LineUntil=%%?& set /A LineUntil-=1
  For /L %%C in (%LineFrom%, 1, %LineUntil%) do set "txtmask=!txtmask!\[%%C\] "
  (for /f "tokens=1* delims=]" %%a in ('find /v /n "" ^<"%~f0"^| findstr /B "%txtmask%" 2^>nul') do Echo=%%b)> "%temp%\my_key.reg"
  REG IMPORT "%temp%\my_key.reg"& >nul del "%temp%\my_key.reg"
Exit /B
 
======================
:SetConsoleColor begin
Windows Registry Editor Version 5.00
 
[HKEY_CURRENT_USER\Console]
"ScreenColors"=dword:0000001a
 
[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"ScreenColors"=dword:0000001a
:SetConsoleColor end
====================
==================================
:SetDefaultKeyboardLayout_EN begin
Windows Registry Editor Version 5.00
 
[HKEY_CURRENT_USER\Keyboard Layout\Preload]
"1"="00000409"
:SetDefaultKeyboardLayout_EN end
================================


Комментарий к коду
Bash
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
@echo off
:: EnableExtensions - Включаем поддержку ключей For /F, For /L
:: EnableDelayedExpansion - Включаем поддержку раскрытия переменных через (!)
SetLocal EnableExtensions EnableDelayedExpansion
 
:: Вызываем функцию RegKeyExecute с аргументом SetConsoleColor
call :RegKeyExecute SetConsoleColor
pause
 
:: Вызываем функцию RegKeyExecute с аргументом SetDefaultKeyboardLayout_EN
call :RegKeyExecute SetDefaultKeyboardLayout_EN
pause
exit /B
 
 
:RegKeyExecute [Имя ресурса]
:: Записывает в переменную LineFrom номер строки, в которой находится текст [Имя ресурса] + ключевое слово "begin", set /A ...+1 начало на одну строку ниже
  For /F "tokens=1 delims=[]" %%? in ('find /i /n "%~1 begin" ^< "%~f0"') do set LineFrom=%%?& set /A LineFrom+=1
:: Записывает в переменную LineUntil номер строки, в которой находится текст [Имя ресурса] + ключевое слово "end", set /A ...-1 конец на одну строку выше
  For /F "tokens=1 delims=[]" %%? in ('find /i /n "%~1 end" ^< "%~f0"') do set LineUntil=%%?& set /A LineUntil-=1
:: Записывает в переменную txtmask номера строк этого файла, где находится читаемый Reg
  For /L %%C in (%LineFrom%, 1, %LineUntil%) do set "txtmask=!txtmask!\[%%C\] "
  (
  :: Нумерует строки всего файла, а потом фильтрует только те, что в переменной txtmask
  for /f "tokens=1* delims=]" %%a in ('find /v /n "" ^<"%~f0"^| findstr /B "%txtmask%" 2^>nul') do Echo=%%b
  :: и записывает текст из этих строк во временную папку, в файл my_key.reg
  )> "%temp%\my_key.reg"
  :: Применяет ключевой файл реестра
  REG IMPORT "%temp%\my_key.reg"& >nul del "%temp%\my_key.reg"
  :: Возвращается в точку вызова подпрограммы
Exit /B
 
:: Просто разделитель для наглядности
======================
:: Здесь пишем произвольное имя, по которому будем идентифицировать + дописываем к нему знак пробела и ключевое слово "begin"
:SetConsoleColor begin
Windows Registry Editor Version 5.00
 
[HKEY_CURRENT_USER\Console]
"ScreenColors"=dword:0000001a
 
[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"ScreenColors"=dword:0000001a
:: в конце делаем тоже самое, но дописываем слово "end"
:SetConsoleColor end
====================
==================================
:SetDefaultKeyboardLayout_EN begin
Windows Registry Editor Version 5.00
 
[HKEY_CURRENT_USER\Keyboard Layout\Preload]
"1"="00000409"
:SetDefaultKeyboardLayout_EN end
================================


Спасибо Koza Nozdri за поднятие вопроса по данной проблеме.
1
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
13.10.2013, 18:15  [ТС] #41
Способ обращениям к разным веткам JS-скрипта, упакованного в батник

Демонстрируются функции:
1) повышения привилегий
2) Имитация MSGBOX (Popup) с отработкой вариаций нажатой клавиши
3) запуска с сокрытием окна

Кликните здесь для просмотра всего текста
Bash
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
@set @x=0; /*
@echo off
SetLocal EnableExtensions
chdir /d "%~dp0"
 
:: повышение привилегий
if /i "%~1" neq "Admin" ver | find "6." && cscript.exe //nologo //e:jscript "%~f0" "Run" "Admin"& Exit
 
::вызов MSGBOX 
call :msgbox " Архив SITLog поврежден.\n Хотите скачать его еще раз?" YesNo
if errorlevel 1 (
  ;;; echo Запускаю wget сокрытом режиме...
  cscript.exe //nologo //e:jscript "%~f0" "Run" "Hide" "wget -N -P ^"here^" http://tools.safezone.cc/glax24/SIT/SITLog.7z"
) else (
  ;;; echo Вы выбрали "Нет"
)
pause
Exit /B
 
:msgbox [Сообщение] [Вид кнопок - YesNo или OK]
:: JS-имитация окна MSGBOX с возвратом кода ошибки при нажатой клавише: 0 - Нет, 1 - Да]
  if /i "%~2"=="YesNo" (set ButtonConst=36) else (set ButtonConst=64)
  for /f %%a in ('cscript.exe //nologo //e:jscript "%~f0" "Msgbox" "%~1" "%ButtonConst%"') do set msg_err=%%a
  if "%msg_err%"=="6" set "msg_retCode=1"
  if "%msg_err%"=="7" set "msg_retCode=0"
Exit /B %msg_retCode%
 
*/switch (WScript.Arguments(0)) {
  case "Run":
  {
    switch (WScript.Arguments(1)) 
    {
      case "Admin": {
        new ActiveXObject('Shell.Application').ShellExecute (WScript.ScriptFullName,'Admin','','runas',1);
        break;
      }
      case "Hide": {
        new ActiveXObject('WScript.Shell').Run (WScript.Arguments(2),0,false);
        break;
      }
    }
  }
  case "Msgbox": {
    WScript.Echo (new ActiveXObject('WScript.Shell').Popup (WScript.Arguments(1).replace(/\\n/g,'\n'),-1,'',+WScript.Arguments(2)));
    break;
  }
}
2
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
09.11.2013, 20:04  [ТС] #42
Демонстрация комбинированного BAT-HTA файла.

Копирование в буфер обмена аргументов запуска батника
от Dragokas

Кликните здесь для просмотра всего текста
Bash
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
@echo off&:: <!--
SetLocal
echo Копирование в буфер аргументов запуска батника
echo Заданы аргументы: %*
 
"%windir%\system32\mshta.exe" "%~f0" %*
 
echo Готово.& echo.
pause
goto :eof
 
//-->
<html>
    <head>
    <HTA:APPLICATION
        ID="objHTA"
        WindowState="minimize"
        ShowInTaskbar="yes"
    />
    </head>
<script language="VBScript">
<!--
Sub Window_onLoad()
    comm = objHTA.CommandLine
    document.parentwindow.clipboardData.SetData "text", mid(comm, instr(2, comm, """") + 2)
    window.close()
End Sub
//-->
</script>
</html>


Способ от ComSpec:

Bash
1
2
3
4
5
6
7
8
9
@echo off
chcp 1251>nul
set "string="Hello, World!" & Hello, Алекс aka Dragokas!"
set "string=%string:"=~!@#$%"
set "string=%string: =$#@!~%"
for /f "delims=" %%i in ("%string%") do (
 mshta "vbscript:document.parentwindow.clipboardData.SetData("text",replace(replace("%%i","~!@#$",chr(34)),"$#@!~%",chr(32)))&close()"
)
exit /b
5
FraidZZ
Ex-Member
3903 / 1529 / 229
Регистрация: 06.01.2013
Сообщений: 4,052
Завершенные тесты: 1
24.11.2013, 14:13 #43
Считывание файла в переменную с учетом переносов строк (SIC!)
Код
Bash
1
2
3
4
5
6
7
8
9
10
11
:ReadTo
set _m=^
 
 
 
::Не удаляем пустые строки выше!!!
for /f "usebackq tokens=*" %%A IN (`find /C /V ""^<"%~1"`) DO (set _cn=%%A)
(for /L %%A IN (1 1 !_cn!) DO (set "_fa="&set /p "_fa="&set %~2=!%~2!!_fa!!_m!))<"%~1"
set %~2=!%~2:~0,-1!
(set _cn=&set _fa=&set _m=)
exit /b

Требования к окружениюДолжно быть включено отложенное раскрытие переменных (команда setlocal enabledelayedexpansion)

Синтаксис
Bash
1
call :ReadTo <Имя файла> <Имя переменной>

Пример
some.txt

Код
1
2
3
4
5
6
7


8
9
10
 1
2

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@echo off
setlocal enabledelayedexpansion
set file=some.txt
call :ReadTo "%file%" fc
echo.!fc!
::echo.%fc% - не работает! Все переменные с CRLF можно раскрывать только через "!"
pause>nul
exit /b
:ReadTo
set _m=^
 
 
 
::Не удаляем пустые строки выше!!!
for /f "usebackq tokens=*" %%A IN (`find /C /V ""^<"%~1"`) DO (set _cn=%%A)
(for /L %%A IN (1 1 !_cn!) DO (set "_fa="&set /p "_fa="&set %~2=!%~2!!_fa!!_m!))<"%~1"
set %~2=!%~2:~0,-1!
(set _cn=&set _fa=&set _m=)
exit /b
Вывод консоли
Код
1
2
3
4
5
6
7


8
9
10
 1
2

2
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
24.11.2013, 16:46  [ТС] #44
FraidZZ, шикарно. Все строки хранятся в одной переменной (не массиве).
Хотелось бы подробно разобрать этот пример здесь: Обсуждение сложных кодов, команд и синтаксиса*
0
FraidZZ
Ex-Member
3903 / 1529 / 229
Регистрация: 06.01.2013
Сообщений: 4,052
Завершенные тесты: 1
25.11.2013, 15:30 #45
В качестве логического продолжения:
Bash
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
@echo off
setlocal enabledelayedexpansion
set table=ABCD\nEFGH\nIJKL\nMNOP\nQRST\nUVWX\nYZ
call :parse table table_
echo.!table_!
pause>nul
exit /b
:parse
set _CR=^
 
 
set _T=!%~1!
set _a=0
:again_
 if "!_T:~%_a%,1!"=="" goto out_
 if "!_T:~%_a%,2!"=="\n" (
  set %~2=!%~2!!_CR!
  set /a _a=%_a%+1
 ) else (
  set %~2=!%~2!!_T:~%_a%,1!
 )
 set /a _a=%_a%+1
goto again_
:out_
exit /b
Парсинг переменной с \n в переменную с CRLF
2
25.11.2013, 15:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2013, 15:30
Привет! Вот еще темы с ответами:

Баннерные скрипты, скрипты посещаемости - Контекстная реклама
Всем привет,хотелось бы узнать как организовать баннерную систему у себя на сайте,такую чтобы считывала количество кликов по банеру,ставила...

Очень редкие БСОДы 0x000000D1 & 0x0000008E со ссылкой на win32k.sys - BSOD
Достаточно редкие (может раз в месяц, может раз в пару недель), но не приятные бсоды на одном компе, пользователь на работу приходит очень...

При продолжительной игры в GTA V начинают появляться редкие полосы в текстурах или падает видеодрайвер - Видеокарты
Здравствуйте. Расскажу все сначала. Недавно, при продолжительной игры (часа 2-3) в GTA V (Единственное во что играю), начинали появляться...

Определить минимальное количество листов, которое должно быть в книге, чтобы редкие ингредиенты не пострадали - Pascal ABC
1935. Слёзы утопленников Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ Гадалка Тиа Дальма, давняя подруга капитана Джека...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.