我想将sc查询的输出通过管道传递给powershell中的方法。例如,检查服务的状态并找到显示“已停止”的部分,然后根据该输出执行操作。
从sc查询的输出中有没有办法做到这一点?还是我需要将结果输出到文本文件,然后..我不确定,请运行for循环来查找我要查找的片段,以使if条件为true / false。
这是我到目前为止所拥有的:
Function IsStopped {
sc.exe query remoteregistry >> RemoteRegistry.txt
Get-Content -Path C:\RemoteRegistry.txt | Where-Object {$_ -like '*stopped*'} | ForEach-Object {
}
不确定下一步要去哪里吗?
答案 0 :(得分:1)
PowerShell具有一个用于检查服务的cmdlet。在不使用参数的情况下运行Get-Service
会以与sc.exe
相同的方式为您提供所有正在运行的服务(实际上,在研究此过程时,我提醒自己,在没有sc
的PowerShell .exe
中, Set-Content
的别名,所以我最终生成了一些无用的文件。这可能是使用Get-Service
以避免与Set-Content
混淆的另一个很好的理由。
运行Get-Service | Get-Member
给出命令输出中的属性和方法的列表。 Status
是您感兴趣的属性,因此我们运行:
Get-Service | Where-Object { $_.Status -eq 'Stopped' }
然后,按照您的建议,可以将此命令的输出通过管道传递给for每个循环,并且可以使用$_
速记来访问每个服务的属性或方法:
Get-Service | Where-Object { $_.Status -eq 'Stopped' } | ForEach-Object {
Write-Host "Do something with $($_.ServiceName)"
}
可以使用$_.Start()
以这种方式重新启动服务,但是如果您的最终目的是,我建议向该过程中写入一些错误处理。”
如果您需要更多信息(例如可执行文件),则可能需要在这里查看:
How can I extract "Path to executable" of all services with PowerShell