隐藏在控制台上的完整输出

Full output hidden on console

我没有得到我编写的以下代码的完整输出。

例如:

DriveSpace                         : {174, 0, 98, 171...}

注意 171 之后的省略号 (...)。它会跳过之后的其余输出。您可以 运行 下面的脚本来查看我的输出。

#Start of script
$cpu            = gwmi -Class Win32_Processor | Select-Object NumberOfCores,NumberOfLogicalProcessors
$memory         = gwmi -class win32_physicalmemory | Select-Object {[math]::truncate($_.capacity / 1GB)}
$HostDescription= gwmi -Class Win32_OperatingSystem
$fqdn           = "$env:computername.$env:userdnsdomain"
$OS             = (gwmi Win32_OperatingSystem)
$OSarchitecture = (gwmi Win32_OperatingSystem)
$disk           = gwmi Win32_LogicalDisk | Select-Object DeviceID, volumeName, {[math]::truncate($_.size / 1GB)}
$timezone       = [System.TimeZone]::CurrentTimeZone
$fire           = netsh advfirewall show publicprofile | select-string state
$firematch      = $fire -match "off"
$slmgrResult    = cscript c:\windows\system32\slmgr.vbs /dli | Select-string "License Status"
$activation     = $slmgrResult -match "Licensed"
$apps           = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |Select DisplayName, DisplayVersion, Publisher, InstallDate
$network        = Get-WmiObject win32_networkadapterconfiguration -filter "ipenabled = 'True'" | select-object IPAddress, DefaultIPGateway, DNSDomain, IPSubnet
$props = @{            
    NumberOfCores               = $cpu.NumberOfCores
    NumberOfLogicalProcessors   = $cpu.NumberOfLogicalProcessors
    Memory                      = $memory.{[math]::truncate($_.capacity / 1GB)}
    HostDescription             = $HostDescription.Description
    FQDN                        = "$env:computername.$env:userdnsdomain"
    OS                          = (gwmi Win32_OperatingSystem).Name
    OSarchitecture              = $OSarchitecture.OSArchitecture
    DriveLetters                = $disk.DeviceID
    DriveLabels                 = $disk.volumeName
    DriveSpace                  = $disk.{[math]::truncate($_.size / 1GB)}
    timezone                    = [System.TimeZone]::CurrentTimeZone.StandardName
    FirewallDisabled            = $firematch
    Licensed                    = $activation
    Applications                = $apps
    IPAddress_Gateway_DNSDomain_subnet = $network.IPAddress, $network.DefaultIPGateway, $network.DNSDomain, $network.IPSubnet
    }
New-Object PSObject -Property $props
#End of script

这是工作中 Powershell 的默认格式,由 Out-Default 提供。它正在截断 DriveSpace 数组以显示在控制台的 table 中,但信息仍然存在。例如,如果您键入:

$props.DriveSpace

...您将看到显示的完整数组。默认格式在处理简单数组时的行为与处理复杂对象(如您创建的 $props 对象时的行为不同。

另请参阅: How Powershell Outputting and Formatting REALLY works

这不是官方答案,因为我认为 OP 需要明确他期望的输出。尽管如此,这还是一个开始

虽然我还没有找到支持这一点的官方文档,但您只是看到了 PowerShell 如何处理控制台输出。考虑以下示例,它是不同大小数组的集合。

[pscustomobject]@{
    data = "1","2","3","4","5"
}

将产生以下列表样式输出。

data : {1, 2, 3, 4...}

请注意 5 属性 的第五个元素现在有省略号。数据还在。它刚刚在控制台上被截断以使输出更简洁和更易于阅读。在这种情况下,这样做似乎很愚蠢,但对于一些复杂的输出对象,PowerShell 必须在某处划清界限。

防止省略号

正如 PetSerAL 所指出的,您可以在输出之前使用以下代码行。

$FormatEnumerationLimit=-1

如果您查看 about_Preference_Variables,您会发现默认情况下它设置为 4。这将支持您看到的输出。将该值设置为更高的值或 -1,看看是否有帮助。

其他潜在问题

就像我的评论一样,我想提请注意您创建的名为 $disk 的变量。输出如下。 注意这是我自己的机器,与你的不匹配。不过,你应该得到照片

DeviceID volumeName      [math]::truncate($_.size / 1GB)
-------- ----------      -------------------------------
C:                                                   111
D:       Data                                        499
E:       Multimedia                                 1362
F:                                                     0
G:       CentOS 7 x86_64                               3
M:       Media                                      2794
Z:                                                     0

没有任何其他信息,我只能假设您想要显示一系列免费的 space 值。鉴于我们可以通过将这些结果转换为字符串来将这些结果从数组中分离出来。还想更新填充变量的行。

$disk = gwmi Win32_LogicalDisk | Select-Object DeviceID, volumeName, @{Label="Size(GB)";Expression={[math]::truncate($_.size / 1GB)}}

在 $disk 中为我们提供以下内容`

DeviceID volumeName      Size(GB)
-------- ----------      --------
C:                            111
D:       Data                 499
E:       Multimedia          1362
F:                              0
G:       CentOS 7 x86_64        3
M:       Media               2794
Z:                              0

然后当您构建哈希表时,您可以将数组转换为单个 space 分隔字符串,如下所示:

DriveSpace                  = [string]($disk."Size(GB)")

可以肯定会有更多问题由此而来,但这至少是一个开始。欢迎来到 SO。在这种情况下,尽可能向我们展示所需的输出总是一个好主意,这样我们就知道您要实现的目标。即使你认为这是显而易见的。

旁注

$disk 之外,您还有其他属性可能会遇到与 Applications 相同的问题,后者是一个复杂的对象。如果您确实遇到这些问题,那么解决这个问题可能会让您朝着正确的方向前进。

您打给 gwmi Win32_OperatingSystem 的电话很多。您应该将其结果保存到一个变量中,您可以在需要时引用它。现在你正在浪费时间调用它并得到相同的结果。例如:

$wmiOS = gwmi Win32_OperatingSystem