随着时间的推移,(幸运的是)越来越常见的是命令行安装程序对于大多数 Windows GUI 程序,因此您可以进行批量和离线控制台安装。
但有时我发现奇怪的行为在请求(通过-?
,-help
...等)其使用语法时,它们打开一个新控制台(cmd
)窗户,(快速)显示语法和参数...并再次关闭太快了,所以用户没有时间阅读任何事物。
示例:Bitvise SSH 安装程序 (试用版可用)。我请求语法为它的文档说:
BvSshServer-Inst.exe -?
A新的 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 中使用提升的命令提示符在命令行上获得相同的行为:
跑步->命令执行程序→ Ctrl+ Shift+Enter
导航到 Bitvise 安装程序所在的位置并使用该
-help
选项运行它;输出将正常。
如何解决/解决这个问题?
至于如何从命令行运行此类程序,而无需通过该程序的 UAC 提示进行 STDOUT 重定向,上述问题中的最后评论提供了一个线索,您可以使用海拔 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: %*
安装这些玩具的基本说明是这里。