【发布时间】:2014-04-25 20:04:09
【问题描述】:
作为练习,我正在尝试为 Hyper-V 制作一个 Web 控制面板。它将使用 Powershell 与 Hyper-V 交互。
我尝试做的第一件事是使用 Get-VM 命令创建一个表,其中包含本地计算机上所有 VM 的状态。我从 PHP 运行 Get-VM:
$output = `powershell Get-VM`;
$output 变为 NULL。经过大量故障排除后,我意识到除非 Powershell 以管理员身份运行,否则 Get-VM 不会提供输出(我正在以管理员身份运行我正在测试的 Powershell 实例,但由 PHP 创建的实例没有运行作为管理员)。
然后,我进入powershell.exe文件,右键单击它,进入属性->兼容性->更改所有用户的设置,并选中“以管理员身份运行”。无论从哪里开始,这都应该使其以管理员身份运行,并且在这种情况下似乎也确实如此。但是,一旦 Powershell 以管理员身份运行,它不会输出到文件,即使 > 操作员告诉它这样做。
如果我运行powershell Get-VM > out.txt,当powershell 以管理员身份运行时,它会创建文件out.txt,但它是0kb 并且不包含任何内容。 powershell Get-Process > out.txt 有同样的结果,一个 0kb 的文件。
使用非提升的 powershell.exe 运行 powershell Get-Process > out.txt 会产生预期的结果,即 out.txt 中 Get-Process 的输出。但是,您不能使用 powershell Get-VM > out.txt 执行此操作,因为除非以管理员身份运行 powershell,否则 Get-VM 不会返回任何数据。
总结一下,我的问题是,如果 Powershell 以管理员身份运行,为什么它拒绝将其 STDOUT 重定向到文件,但如果它以普通用户身份运行,则不会?
【问题讨论】:
-
我无法使用 PowerShell v3 或 v4 复制该问题。我打开了一个提升的 CMD 窗口,然后运行
powershell get-process > c:\temp\out.txt并在文件中得到了预期的结果。 -
当您运行
powershell Get-Process > out.txt时,您从什么运行它? PowerShell 的另一个实例? cmd.exe?重定向由您运行的任何环境处理。试试powershell -command "& {Get-VM > c:\out.txt}"? -
另外,您确定您没有在快捷方式上设置“以管理员身份运行”属性吗?在 FileExplorer 中,当我在 C:\Windows\System32\WindowsPowerShell\v1.0 目录中右键单击 PowerShell.exe 时,我看不到任何兼容性选项卡或设置始终以管理员身份运行的方法。跨度>
-
TheMadTechnician:我也明白。当您从非提升的 CMD 提示符调用它时会出现问题,但 powershell.exe 本身设置为以管理员身份运行。这对于用例来说是“正确的”,因为 PHP 的
shell_exec没有被提升。 Keith Hill:我从哪里运行它似乎并不重要,无论是 PHPshell_exec、PHPexec、反引号运算符、CMD 还是 Powershell 本身。 -
关于快捷方式的东西:不,它没有设置在快捷方式上。似乎 Windows 进行了某种检查,以防止您将其设置为以管理员身份运行。但是,如果您将文件复制到另一个目录,它会让您执行此操作,然后您可以将其复制回来(如果您对其文件夹具有写入权限)。我认为这与权限有关。有趣的是,每当我调用 powershell 命令时,无论它来自何处,我都可以在屏幕上看到输出(在加载页面时,提示符可见一秒钟我们两个),但它不会进入文件。跨度>
标签: file powershell redirect stdout administrator