[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
Коллекция VBS-вставок для использования в CMD-скриптах.

Browse for folder

Заголовок может быть многострочным, строки разделяются символом "^".
>tst.vbs echo set dir=CreateObject("Shell.Application").BrowseForFolder(0, Replace(WScript.Arguments(0), "^", vbCrLf), 8, 17) : If not dir is Nothing Then WScript.Echo dir.Self.Path
set dir=& for /f "delims=" %%a in (
'cscript //nologo tst.vbs "Заголовок дерева выбора папок:"'
) do set "dir=%%a"
if defined dir echo "%dir%"
del /q tst.vbs

Select file

Использование VBS здесь необязательно, но тогда нужно не забывать менять кодовую страницу на 1251.
>tst.vbs echo WScript.Echo CreateObject("WScript.Shell").Exec("mshta.exe ""about:<input type=file id=FILE><script>FILE.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>""").StdOut.ReadLine
set fname=& for /f "delims=" %%a in ('cscript //nologo tst.vbs') do set "fname=%%a"
if defined fname echo "%fname%"
del /q tst.vbs

InputBox

Заголовок строки может быть многострочным, строки разделяются символом "^".
>tst.vbs echo WScript.Echo InputBox(Replace(WScript.Arguments(0), "^", vbCrLf), WScript.Arguments(1), WScript.Arguments(2))
set ln=& for /f "delims=" %%a in (
'cscript //nologo tst.vbs "Заголовок строки ввода:" "Заголовок окна" "Значение по умолчанию"'
) do set "ln=%%a"
if defined ln echo "%ln%"
del /q tst.vbs

MsgBox & Popup

Сообщение может быть многострочным, строки разделяются символом "^".
Комбинация кнопок, значков и дефолта через суммирование. Например: 4+32+256 -> set opt=292
set opt=17
::    0 = Кнока "OK"
::    1 = Кнопки "OK" и "Cancel"
::    2 = Кнопки "Abort", "Retry", "Ignore"
::    3 = Кнопки "Yes", "No", "Cancel"
::    4 = Кнопки "Yes" и "No"
::    5 = Кнопки "Retry" и "Cancel"
::   16 = Иконка "Critical Message"
::   32 = Иконка "Question Message"
::   48 = Иконка "Warning Message"
::   64 = Иконка "Information Message"
::    0 = Первая кнопка по умолчанию
::  256 = Вторая кнопка по умолчанию
::  512 = Третья кнопка по умолчанию
::  768 = Четвёртая кнопка по умолчанию
:: 4096 = Режим "System modal" (все приложения системы ждут нажатия кнопки)
>tst.vbs echo WScript.Echo MsgBox(Replace(WScript.Arguments(0), "^", vbCrLf), WScript.Arguments(1), WScript.Arguments(2))
for /f %%a in (
'cscript //nologo tst.vbs "Сообщение" %opt% " Заголовок"'
) do set code=%%a
::    1 = OK
::    2 = Отмена (Cancel)
::    3 = Стоп (Abort)
::    4 = Повтор (Retry)
::    5 = Пропустить (Ignore)
::    6 = Да (Yes)
::    7 = Нет (No)
del /q tst.vbs
set opt=17
:: Время задержки, секунд. 0 = бесконечно
set wait=10
>tst.vbs echo WScript.Echo CreateObject("WScript.Shell").Popup(Replace(WScript.Arguments(0), "^", vbCrLf), WScript.Arguments(1), WScript.Arguments(2), WScript.Arguments(3))
for /f %%a in (
'cscript //nologo tst.vbs "Сообщение" %wait% " Заголовок" %opt%'
) do set code=%%a
::   -1 = время истекло (нет нажатия)
del /q tst.vbs

Run as Administrator

Применяется решение через создание стороннего файла (%tmp%\1.cmd) из-за проблем с путями нестандартного вида (спецсимволы, кириллица и проч.)
>nul 2>&1 dism&& 2>nul del /q %tmp%\1.cmd|| goto runas
exit
:runas
>%tmp%\1.cmd echo @"%~f0" "параметры запуска"
>tst.vbs echo CreateObject("Shell.Application").ShellExecute "%comspec%", "/c %tmp%\1.cmd", "", "runas", 1
cscript //nologo tst.vbs
del /q tst.vbs
:: Вид окна приложения: normal=1, hide=0, 2=Min, 3=max, 4=restore, 5=current, 7=min/inactive, 10=default

Unzip & System copy

В качестве источника может выступать не только архив (.zip или .cab), но и папка, и тогда будет происходить копирование содержимого через системную функцию копирования с окном прогресса.
>tst.vbs echo With CreateObject("Shell.Application") .NameSpace(WScript.Arguments(0)).CopyHere(.NameSpace(WScript.Arguments(1)).Items) End With
cscript //nologo tst.vbs "$:\Папка\назначения" "$:\Источник\архив.zip"
del /q tst.vbs

Download

>tst.vbs echo set x=CreateObject("Microsoft.XMLHTTP") : x.Open "GET", WScript.Arguments(0), False : x.Send : With CreateObject("Adodb.Stream") : .type = 1 : .open : .write x.responseBody : .savetofile WScript.Arguments(1), 2 : End With
cscript //nologo tst.vbs "https://www.url.com/file.ext" "file.ext"
del /q tst.vbs
-

Shortcut

With CreateObject("WScript.Shell").CreateShortcut("test.lnk")
.TargetPath = "%comspec%"
.Arguments = "/c dir& pause"
.Description = "MyProgram"
.HotKey = "ALT+CTRL+F"
' "ALT+", "CTRL+", "SHIFT+", "EXT+".
' "A" .. "Z", "0" .. "9", "Back", "Tab", "Clear", "Return", "Escape", "Space", "Prior".
.IconLocation = "%comspec%, 1"
.WindowStyle = "1"
' 3=Maximized, 7=Minimized, 4=Normal
.WorkingDirectory = "%windir%"
.Save
End With

ADODB Stream

Замена в бинарном файле символов 0D 0A => "Пробел" 0A
Можно указывать символьные строки в кавычках.
With CreateObject("ADODB.Stream")
.Open
.Type = 2
.Charset = "Windows-1252"
.LoadFromFile "Исходный файл"
data = .ReadText
.Close
data = Replace(data, Chr(13)&Chr(10), Chr(32)&Chr(10))
.Open
.Type = 2
.Charset = "Windows-1252"
.WriteText data
.SaveToFile "Файл результата", 2
.Close
End With
Считать из бинарного файла блок размером 1000 байт по смещению 1000 байт от начала и записать в другой файл.
set dest = CreateObject("ADODB.Stream")
dest.Open
dest.Type = 1
With CreateObject("ADODB.Stream")
.Open
.Type = 1
.LoadFromFile "Исходный файл"
.Position = 1000
.CopyTo dest, 1000
.Close
End With
dest.SaveToFile "Файл результата", 2
dest.Close


Показать сообщения:    

Текущее время: 28-Мар 13:59

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы