Со временем (к счастью) все чаще можно встретитьустановщики командной строкидля большинства программ с графическим интерфейсом Windows, что позволяет выполнять пакетные и автономные установки консоли.
Но иногда я находилстранное поведениес несколькими установщиками при запросе (через -?
, -help
... и т.д.) их синтаксис использования: ониоткрыть новую консоль( cmd
) окна,показать (быстро) синтаксиси параметры...и снова закрытьслишком быстро, поэтому пользовательнет времени читатьчто-либо.
Пример: установщик Bitvise SSH (Пробная версиядоступен). Я запрашиваю синтаксис какего документыговорит:
BvSshServer-Inst.exe -?
Ановая консоль cmdначинается с высказывания чего-то вроде:
This program will install Bitvise SSH Server 6.07
on the machine it is being run on.
... blah blah blah
... и окноснова закрывается. У меня больше нет времени читать.
Я видел это странное поведение на Windows 7, но не на Windows XP (проверено на трех машинах).
Почему это происходит?
Как это можно решить/обойти?
ПРИМЕЧАНИЕ:
- При доступе к моей машине через удаленную консоль (проверено с удаленной консолью SSH) все проходит нормально (я предполагаю, что через telnet тоже все заработает, но я этого не проверял):
d:\Installer\>BvSshServer-Inst.exe -? | more
This program will install Bitvise SSH Server 6.07
on the machine it is being run on.
Bitvise SSH Server is an SSH2 server for Windows 2000 or newer, including
the latest Windows 8.1 and 2012 R2. Please see www.bitvise.com/ssh-server
for more information.
This program must be run by a user with administrator privileges. If run
without command line options, installation will be performed in interactive
mode. If run with command line options without the '-interactive' option,
installation will be performed in unattended mode.
Usage:
BvSshServer-Inst -installDir=directory OR -defaultSite OR -site=site-name
[-force OR -abortOnWarning[=warning-list-or-mask]
[-acceptEULA] [-interactive] [-noRollback]
[-activationCode=activation-code-hex]
[-keypairs=keypairs-file]
[-settings=settings-file]
[-siteTypeSettings=fileName]
[-startService]
[-startBssCtrl]
ЗАМЕТКА 2:
- Эти команды также не решают проблему:
start "BvSshServer-Inst.exe -? | more"
cmd /k "BvSshServer-Inst.exe -? | more"
BvSshServer-Inst.exe -? | more > Syntax.txt
BvSshServer-Inst.exe -? > Syntax.txt
BvSshServer-Inst.exe -? | more 2> Syntax.txt
решение1
Почему это происходит?
Вы не привели других примеров, кроме Bitvise, но, похоже, это проблема с приглашением UAC. Если программа не работает с требуемыми ей повышенными привилегиями и, следовательно, требуется для отображения приглашения UAC, вывод записывается в другой (новый?) STDOUT. Таким образом, второе окно cmd И почему стандартное перенаправление текста в выходной файл (>) похоже, не работает.Этот вопрос на Stack Overflowпохоже, это подтверждается.
Что касается того, почему это работает на XP, то там нет UAC. Аналогично, вы можете получить то же самое поведение в командной строке в Windows 7 с повышенными правами командной строки:
Бегать->cmd.exe-> Ctrl+ Shift+Enter
Перейдите к месту расположения установщика Bitvise и запустите его с опцией
-help
; вывод будет обычным.
Как можно решить/обойти эту проблему?
Что касается решения для запуска таких программ из командной строки без перенаправления STDOUT с помощью приглашения UAC для этой программы, последние комментарии в вопросе выше дают подсказку, что вы можете использоватьElevation PowerToysчтобы этого добиться.
Загрузите файл с сайтаздесь(ссылка вверху страницы Elevation PowerToys). На самом деле это архив, дважды щелкните, чтобы извлечь файлы в нужное вам место (я предлагаю папку!).
После извлечения файлов скопируйте elevate.cmd и elevate.vbs и поместите их в удобное место (в тот же каталог).
Создатьпакетный файл, убедившись, что учтены соответствующие пути к elevate.cmd. Это все равно отобразит запрос UAC, но не для Bitvise, и в этом вся разница.
@echo off setlocal enabledelayedexpansion set CmdDir=%~dp0 set CmdDir=%CmdDir:~0,-1% :: Check for Mandatory Label\High Mandatory Level whoami /groups | find "S-1-16-12288" > nul if "%errorlevel%"=="0" ( echo Running as elevated user. Continuing script. ) else ( echo Not running as elevated user. echo Relaunching Elevated: "%~dpnx0" %* if exist "%CmdDir%\elevate.cmd" ( set ELEVATE_COMMAND="%CmdDir%\elevate.cmd" ) else ( set ELEVATE_COMMAND=elevate.cmd ) set CARET=^^ !ELEVATE_COMMAND! cmd /k cd /d "%~dp0" !CARET!^& call "%~dpnx0" %* goto :EOF ) :: Continue script here BvSshClient-Inst.exe -help BvSshClient-Inst.exe -help > txt.txt echo Arguments passed: %*
Основные инструкции по установке некоторых из этих игрушек:здесь.