Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PowerShell 5.1中,如何将命令行应用程序输出到后台的变量?_Powershell_Zabbix_Powershell 5.0_Windows Server 2019_Command Line Arguments - Fatal编程技术网

在PowerShell 5.1中,如何将命令行应用程序输出到后台的变量?

在PowerShell 5.1中,如何将命令行应用程序输出到后台的变量?,powershell,zabbix,powershell-5.0,windows-server-2019,command-line-arguments,Powershell,Zabbix,Powershell 5.0,Windows Server 2019,Command Line Arguments,已解决 感谢@mklement0的建议,我尝试从rstcli64.exe获取退出代码: 从cmd我得到0 从zabbix代理我得到3(根据手册,无效的_设备) 因此,罪魁祸首不是PowerShell,而是rstcli64.exe在退出时出现了一个错误:Windows Server 2019并从zabbix代理运行的PS脚本运行。我已经从Intel的网站上更新了rstcli,新版本具有相同的语法,在新的条件下可以完美地工作 原创帖子 我有Windows Zabbix代理,它运行PowerShe

已解决

感谢@mklement0的建议,我尝试从rstcli64.exe获取退出代码:

  • 从cmd我得到0
  • 从zabbix代理我得到3(根据手册,无效的_设备) 因此,罪魁祸首不是PowerShell,而是rstcli64.exe在退出时出现了一个错误:Windows Server 2019并从zabbix代理运行的PS脚本运行。我已经从Intel的网站上更新了rstcli,新版本具有相同的语法,在新的条件下可以完美地工作
原创帖子

我有Windows Zabbix代理,它运行PowerShell脚本,运行命令行应用程序,解析输出并给出1或0

$states = C:\util\rstcli64.exe --information --volume 2> $null | select-string -Pattern "State:"

$notNormalStates = $states | Select-String -Pattern "Normal" -NotMatch
if ($states.Count -gt 0 -and $notNormalStates.Count -eq 0){
    "1"
} Else {
    "0"
}
此脚本在Windows Server 2012 R2上运行,但在迁移到Windows Server 2019(使用PowerShell 5.1)后,它开始仅输出0

这是一种波粒二元性的情况:如果我从命令行(用户、管理员、系统-相同)运行此脚本,它给出1,因为它接收来自rstcli64.exe的输出;如果zabbix代理运行这个脚本,它从rstcli64.exe中什么也得不到,因此得到0

所以我想区别在于我从一个交互式shell运行脚本,而zabbix代理从后台运行脚本

问题是:当在后台运行时,如何从PowerShell 5.1(Windows Server 2019)中的命令行应用程序获取输出

更多信息

如果我只是用这个:

$states = C:\util\rstcli64.exe --information --volume
$states
exit
如果在命令行中运行脚本,它会显示大量数据:

--卷信息--

名称:HDD\U镜像Raid级别:1大小:
1863 GB条带大小:64 KB个磁盘:2个状态:
正常系统:真初始化:真缓存策略:
R

--卷中的磁盘:HDD\U镜像--

ID:0-0-0-0类型:磁盘类型:
SATA磁盘状态:正常

但是如果是从zabbix跑来的-什么都没有:

6304:20201014:170446.686执行 命令:'%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -nologo-ExecutionPolicy ByPass-文件“C:\util\intel_rst_raid.ps1”'len:0 cmd_结果:“”6304:20201014:170446.686正在发回[]
8208:20201014:170446.687收集结束_perfstat()

更多信息


它只是通过rstcli64.exe实现的。当我在cmd中手动运行脚本并从zabbix代理触发脚本时,很少有其他命令行工具可以提供相同的输出。同样,仅在Windows Server 2019的PowerShell 5.1中,所以…

这听起来像是重定向和流的问题。信息流是在5.0中引入的,Windows 2012R2附带4.0。这也许可以解释不同的行为

我会和重定向操作符一起玩,看看你是否能得到你需要的东西,通过管道传送到
selectstring
。它可能看起来像:

$states = C:\util\rstcli64.exe --information --volume *>&1 | select-string -Pattern "State:" 
这将获取所有流,并将它们重定向到成功流,这样所有内容都将通过管道传输到
Select string


我还建议你可以让你的正则表达式更精确一点。可能是
“^State:”
,因此您正在捕获以“State:”开头的行。虽然我不知道前面是否有空格。

正则表达式很好。如果我输出$states变量,我会在$states中收到很多“State:normalstate:normalstate:normalstate”命令。如果我在cmd中运行。但如果zabbix代理运行相同的脚本,则什么都没有。“*>&1”没有帮助,结果是相同的,但我对可执行文件了解不够,无法单独测试。您可以尝试
启动进程
,该进程具有
-RedirectStabdardError
-RedirectStandardOutput
参数。基于其他可能需要试验的注释。rstcli64.exe是“英特尔快速存储命令行界面工具”,可输出有关RST控制器和驱动器的不同信息。您可以从Intel网站下载并运行它,即使您没有Intel controllerOK,谢谢。但主要问题仍然是个秘密。另一方面——尽管如此,在这里,这并不重要,也不能解释症状-是不是zabbix运行32位版本PowerShell的PowerShell实例?Re 64位:重要的是zabbix本身是32位还是64位-32位进程将不同的目录视为
%SystemRoot%\system32
。在32位进程中,您必须使用“%SystemRoot%\SysNative”来访问64位目录。我从未使用过
rstcli64.exe
,因此在这方面我无法提供帮助。但请注意,还有一个额外的谜团,那就是根本没有任何输出被捕获——除非zabbix也捕获了stderr(在这种情况下来自PowerShell的错误)。如果可以检查进程退出代码,请查看它是否为
1
:这将表明由于脚本终止错误(粗略地说,是未处理的异常),脚本的执行根本失败(如果它达到了该点)。@mklement0我使用
$lastExitCode
获得了rstcli的退出代码!在cmd中为0,从zabbix中为3!所以,绝对与Powershell无关。非常感谢。我会研究的。