我有一个脚本,用于扫描服务的服务器/计算机列表并显示状态。
我在两台计算机上运行PS版本5 Build 10586修订版117.
在运行PSv5的Windows 7计算机上,StartType输出到.txt
MachineName ServiceName Status StartType
----------- ----------- ------ ---------
srvcomp0201 My.ServiceName.Here Stopped Stopped
srvcomp0202 My.OtherServiceName Running Running
当我在使用PSv4或v5的Windows 2012计算机上运行相同的脚本时,StartType不会输出到.txt或.csv
MachineName ServiceName Status StartType
----------- ----------- ------ ---------
srvcomp0201 My.ServiceName.Here Stopped
srvcomp0202 My.OtherServiceName Running
我可以更改应该显示的顺序,如:
$s | select MachineName, StartType, ServiceName, Status
在Win2012计算机上运行时,它仍然没有显示任何内容。
为什么要这样做?
$serviceList = Get-Content C:\services.txt
$results = Get-Content C:\servers.txt | ForEach-Object {
foreach ($service in $serviceList) {
if ($s=get-service -computer $_ -name $service -ErrorAction SilentlyContinue)
{
$s | select MachineName, StartType, ServiceName, Status | Out-File C:\test.txt -Append
} else {
"$_ - Service '$service' does not exist."
}
}
}
更新
这不会将StartType写入文件:
$serviceList = Get-Content C:\services.txt
$results = Get-Content C:\servers.txt | ForEach-Object {
foreach ($service in $serviceList) {
if ($s=get-service -computer $_ -name $service -ErrorAction SilentlyContinue)
{
$s | select MachineName, StartType | Out-File C:\test.txt -Append
} else {
"$_ - Service '$service' does not exist."
}
}
}
这不会在我的2012计算机上显示StartType:
get-content c:\servicelist\computers.txt | % {
if ($s=get-service -computer $_ -name W3SVC* -ErrorAction SilentlyContinue) # change -name * to name of service
{
$s | select MachineName, ServiceName, StartType, Status
}
else {"Service is not available on $_"}
}
这是Windows 2012的事吗?
答案 0 :(得分:1)
随操作系统提供的默认PowerShell版本会有所不同。 [见https://4sysops.com/wiki/differences-between-powershell-versions/#powershell-and-windows-versions] Windows 2012附带v3,但Windows 10附带v5,其中添加了StartType属性。
答案 1 :(得分:0)
Windows PowerShell有一系列cmdlet,不使用 PowerShell 远程处理(基于[MS-PRSP], the PowerShell Remoting Protocol specification),通常可以通过拥有自己的-ComputerName
参数来识别(而不是通过“meta”-invocation cmdlet调用它们,例如Invoke-Command -ComputerName
)。
应该放弃使用这个过时的,基于DCOM的 per-cmdlet 远程处理,以支持部分管道 PowerShell远程处理< / strong>即可。
事实上,PowerShell Core 中不再提供per-cmdlet远程处理形式。
因此,而不是:
Get-Service -ComputerName $_ -name $service
使用:
Invoke-Command -ComputerName $_ { Get-Service $service }
后者使用PowerShell远程处理,其要求与基于DCOM的表单远程处理不同,因此可能需要额外的设置;见Get-Help about_Remoting_FAQ
我无法亲自验证这一点,但根据Olaf's对该问题的评论,这可能会隐式解决您的问题(我没有解释)