作为练习,我正在尝试为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自己的out-file
或export-csv
中,这样命令就变成了powershell Get-VM | export-csv out.csv
。然后,我用PHP解析它,并将其转换为一个表。工作起来很有魅力。