powershell获取有关计算机的信息

时间:2019-01-31 19:46:33

标签: powershell export-to-csv export-to-excel

我正在尝试创建powershell脚本(获得更高级的功能……JK。Powershell提供的功能比批处理文件还多,我想使用其中的一些功能。)

所以,这是我的批处理脚本:

:Start 
@echo off 
set /p password="Password:" 
:Nextcomp 
set /p computer="Computer name:" 
wmic /user:username /password:%password% /node:"%computer%" memorychip get capacity 
set /P c=Do you want to get info about another computer (y/n)? 
if /I "%c%" EQU "y" goto :Nextcomp 
if /I "%c%" EQU "n" goto :End goto :choice 
pause 
:End

这就是我的发现:Script 我根据需要对其进行了修改,但是每当我尝试运行此脚本时,都会以错误的方式得到它-它向我显示了整个脚本,直到最后它才询问我有关计算机的名称:

$resultstxt = "C:\Users\user\Documents\results.csv"
Param(
     [Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
     [SecureString]$password
   )
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
$Computer = Read-Host -Prompt 'Computer name'
$out = @()
If (!(Test-Connection -ComputerName $Computer -Count 1 -Quiet)) { 
    Write-Host "$Computer not on network."
    Continue 
}
foreach($object in $HostList) {
$RAM = get-wmiobject -user user -password $pw -computername $object.("Computer")-class win32_physicalmemory 
$DeviceInfo= @{}
$DeviceInfo.add("RAM", "$([math]::floor($RAM.Capacity/ (1024 * 1024 * 1024 )) )" + " GB" )
$DeviceInfo.add("Computer Name", $vol.SystemName)
$out += New-Object PSObject -Property $DeviceInfo | Select-Object "RAM"
Write-Verbose ($out | Out-String) -Verbose             
$out | Export-CSV -FilePath $resultstxt -NoTypeInformation

}

您可能已经猜到了,我有很多字段,但是它们都是相似的,并且我从很多资源中借来了,但主要来自“脚本”链接。

我想要的是:

  1. 隐藏密码
  2. 在每台新计算机(请参阅3.)之后,在当前计算机之后(在下一行)添加信息,并将信息导出为CSV
  3. 询问是否要获取有关另一台计算机的信息,请用“ y”键表示是,用“ n”键表示否。
  4. 使脚本正常工作

我发现了问题1,但尚未测试,所以...行得通吗?接下来,我发现了问题2,但是它将以一种不易阅读的格式显示所有信息,而不是我需要的所有信息,并且全部显示在一个单元格中。最终,我发现大约3,但这是行不通的。我不能说我挖了整个互联网,但我希望你们(还有gal?)能帮我弄清楚。解决这三个问题不应该那么困难,毕竟这不是一个超级复杂的脚本,对吗?我当前的脚本只有31行,包括空格。

1 个答案:

答案 0 :(得分:0)

这是从一组系统中获取基本系统信息的一种方法的演示。它使用CIM cmdlet,因为它们比WMI cmdlet更快(大多数时间),将datetime信息显示为标准datetime对象,并且不建议过时。

它还使用Invoke-Command cmdlet进行远程并行处理,并设置为忽略错误,以便无响应的系统不会浪费您的时间。

#requires -RunAsAdministrator

# fake reading in a list of computer names
#    in real life, use Get-Content or (Get-ADComputer).Name
$ComputerList = @'
Localhost
BetterNotBeThere
127.0.0.1
10.0.0.1
::1
'@ -split [environment]::NewLine

$IC_ScriptBlock = {
    $CIM_ComputerSystem = Get-CimInstance -ClassName CIM_ComputerSystem
    $CIM_BIOSElement = Get-CimInstance -ClassName CIM_BIOSElement
    $CIM_OperatingSystem = Get-CimInstance -ClassName CIM_OperatingSystem
    $CIM_Processor = Get-CimInstance -ClassName CIM_Processor
    $CIM_LogicalDisk = Get-CimInstance -ClassName CIM_LogicalDisk |
        Where-Object {$_.Name -eq $CIM_OperatingSystem.SystemDrive}

    [PSCustomObject]@{
        LocalComputerName = $env:COMPUTERNAME
        Manufacturer = $CIM_ComputerSystem.Manufacturer
        Model = $CIM_ComputerSystem.Model
        SerialNumber = $CIM_BIOSElement.SerialNumber
        CPU = $CIM_Processor.Name
        SysDrive_Capacity_GB = '{0:N2}' -f ($CIM_LogicalDisk.Size / 1GB)
        SysDrive_FreeSpace_GB ='{0:N2}' -f ($CIM_LogicalDisk.FreeSpace / 1GB)
        SysDrive_FreeSpace_Pct = '{0:N0}' -f ($CIM_LogicalDisk.FreeSpace / $CIM_LogicalDisk.Size * 100)
        RAM_GB = '{0:N2}' -f ($CIM_ComputerSystem.TotalPhysicalMemory / 1GB)
        OperatingSystem_Name = $CIM_OperatingSystem.Caption
        OperatingSystem_Version = $CIM_OperatingSystem.Version
        OperatingSystem_BuildNumber = $CIM_OperatingSystem.BuildNumber
        OperatingSystem_ServicePack = $CIM_OperatingSystem.ServicePackMajorVersion
        CurrentUser = $CIM_ComputerSystem.UserName
        LastBootUpTime = $CIM_OperatingSystem.LastBootUpTime
        }
    }

$IC_Params = @{
    ComputerName = $ComputerList
    ScriptBlock = $IC_ScriptBlock
    ErrorAction = 'SilentlyContinue'
    }
$RespondingSystems = Invoke-Command @IC_Params
$NOT_RespondingSystems = $ComputerList.Where({
    # these two variants are needed to deal with an ipv6 localhost address
    "[$_]" -notin $RespondingSystems.PSComputerName -and
    $_ -notin $RespondingSystems.PSComputerName
    })

# if you want to remove the PSShowComputerName, PSComputerName & RunspaceID props, use ... 
#    Select-Object -Property * -ExcludeProperty PSShowComputerName, PSComputerName, RunspaceId


'=' * 40
$RespondingSystems
'=' * 40
$NOT_RespondingSystems

截断的输出...

LocalComputerName           : [MySysName]
Manufacturer                : System manufacturer
Model                       : System Product Name
SerialNumber                : System Serial Number
CPU                         : AMD Phenom(tm) II X4 945 Processor
SysDrive_Capacity_GB        : 931.41
SysDrive_FreeSpace_GB       : 745.69
SysDrive_FreeSpace_Pct      : 80
RAM_GB                      : 8.00
OperatingSystem_Name        : Microsoft Windows 7 Professional 
OperatingSystem_Version     : 6.1.7601
OperatingSystem_BuildNumber : 7601
OperatingSystem_ServicePack : 1
CurrentUser                 : [MySysName]\[MyUserName]
LastBootUpTime              : 2019-01-24 1:49:31 PM
PSComputerName              : [::1]
RunspaceId                  : c1b949ef-93af-478a-b2cf-e44d874c5724

========================================
BetterNotBeThere
10.0.0.1

要获得结构良好的CSV文件,请通过$RespondingSystemsExport-CSV集合发送到该文件。


有关环绕任何给定代码块的循环演示,请看一下...

$Choice = ''

while ([string]::IsNullOrEmpty($Choice))
    {
    $Choice = Read-Host 'Please enter a valid computer name or [x] to exit '
    # replace below with real code to check if $ComputerName is valid
    if ($Choice -eq $env:COMPUTERNAME)
        {
        $ValidCN = $True
        }
        else
        {
        $ValidCN = $False
        }
    if (-not $ValidCN -and $Choice -ne 'x')
        {
        # insert desired error notice
        [console]::Beep(1000, 300)
        Write-Warning ''
        Write-Warning ('Your choice [ {0} ] is not a valid computer name.' -f $Choice)
        Write-Warning '    Please try again ...'
        pause
        $Choice = ''
        }
        elseif ($Choice -ne 'x')
        {
        # insert code to do the "ThingToBeDone"
        Write-Host ''
        Write-Host ('Doing the _!_ThingToBeDone_!_ to system [ {0} ] ...' -f $Choice)
        pause
        $Choice = ''
        }
    }

屏幕输出...

Please enter a valid computer name or [x] to exit : e
WARNING: 
WARNING: Your choice [ e ] is not a valid computer name.
WARNING:     Please try again ...
Press Enter to continue...: 
Please enter a valid computer name or [x] to exit : [MySysName]

Doing the _!_ThingToBeDone_!_ to system [ [MySysName] ] ...
Press Enter to continue...: 
Please enter a valid computer name or [x] to exit : x