【问题标题】:Running a PowerShell command for multiple remote hosts and displaying efficiently为多个远程主机运行 PowerShell 命令并高效显示
【发布时间】:2014-10-02 15:16:53
【问题描述】:

我正在尝试从列表(例如,servers.txt)中确定我的哪些服务器安装了 .NET 4.5 以及 PowerShell 的哪个版本。我有独立的命令,它们会在一个盒子上告诉我这个 -

**

**PS D:\tools> Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client'
Version       : 4.5.51641
CBS           : 1
TargetVersion : 4.0.0
Install       : 1
InstallPath   : C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
Servicing     : 0
Release       : 378675
PSPath        : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework
                Setup\NDP\v4\Client
PSParentPath  : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4
PSChildName   : Client
PSDrive       : HKLM
PSProvider    : Microsoft.PowerShell.Core\Registry**

** 在顶部(版本)显示它确实是 4.5。有没有办法只以表格格式显示版本字段和主机名(或计算机名)?

此外,下面的命令也一样,它会为您提供您的 PowerShell 版本 -

PS D:\tools> get-host |select-object version

Version
-------
4.0

我确实放了完整的路径。这是显示txt文件然后运行命令后的屏幕-

PS D:\tools> type h:\servers.txt
OPP-HOLD
zOPP-SQL12HAa
zOPP-SQLESMA

PS D:\tools> Get-content -path h:\servers.txt | where {$_-match "\S"} | foreach Get-ItemProperty -ComputerName $_ 'HKLM:
\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client' -name Version
foreach : Input name "Get-ItemProperty" cannot be resolved to a method.
At line:1 char:60
+ Get-content -path h:\servers.txt | where {$_-match "\S"} | foreach Get-ItemPrope ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (OPP-HOLD:PSObject) [ForEach-Object], PSArgumentException
    + FullyQualifiedErrorId : MethodNotFound,Microsoft.PowerShell.Commands.ForEachObjectCommand

foreach : Input name "Get-ItemProperty" cannot be resolved to a method.
At line:1 char:60
+ Get-content -path h:\servers.txt | where {$_-match "\S"} | foreach Get-ItemPrope ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (zOPP-SQL12HAa:PSObject) [ForEach-Object], PSArgumentException
    + FullyQualifiedErrorId : MethodNotFound,Microsoft.PowerShell.Commands.ForEachObjectCommand

foreach : Input name "Get-ItemProperty" cannot be resolved to a method.
At line:1 char:60
+ Get-content -path h:\servers.txt | where {$_-match "\S"} | foreach Get-ItemPrope ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (zOPP-SQLESMA:PSObject) [ForEach-Object], PSArgumentException
    + FullyQualifiedErrorId : MethodNotFound,Microsoft.PowerShell.Commands.ForEachObjectCommand

【问题讨论】:

    标签: .net powershell version


    【解决方案1】:

    Invoke-Command 是您所要求的。另一个答案是没有解决来自远程主机的数据请求。

    $computers = Get-Content servers.txt
    
    Invoke-Command -ComputerName $computers -ScriptBlock{
        $powerShellVersion = get-host | select-object -expandproperty version
        $frameWorkVersion = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client' | select-object -expandproperty version
    
        New-Object psobject -Property @{
            "Computer" = $singleComputer
            "PowerShell Version" = $powerShellVersion
            "Framework Version" = $frameWorkVersion
        }
    }
    

    这个未经测试的代码可以简化,但我的目标是更好地理解。对于每个服务器,运行将在自定义对象中返回 PowerShell 版本和 .NET 版本的脚本块。这应该适用于 PowerShell 3.0。请注意the caveats 像这样检查框架版本。如果您只是在寻找 4.5,这应该可以。如果未安装 4.5,您可能需要添加 -erroraction

    【讨论】:

    • 这不如将计算机名称直接传递给Invoke-Command 高效。如果您在多台机器上使用-ComputerName 参数,则会在每台机器上创建远程作业并并行运行。在这里,您正在连续运行这些作业。
    • @mikez 明白了。您将如何在输出中记录计算机名称?我这样做的唯一原因是保存计算机名称以供输出。
    • PowerShell 应自动在 PSComputerName NoteProperty 中附加运行命令的计算机名称。
    • 感谢@mikez 的帮助,进行更多测试,我想我会掌握基础知识。
    • 谢谢,伙计们。我复制并粘贴到记事本中并保存到 getpsinfo.ps1 但是当我运行它时出现以下错误-
    【解决方案2】:

    像这样?

    Invoke-command -comp ( cat servers.txt ) -command { 
      get-host} | where { $_.version -eq '4.5' } | format-table *computer*, version
    

    【讨论】:

    • Invoke-Command 是正确的方法,但我认为 OP 正在寻找你没有的两个命令输出。另外我认为没有 PowerShell 4.5 版本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多