鉴于以下PowerShell 3脚本,Format-Table未将所有属性列为列(它跳过NoRemove
),但Format-List确实如此,您可以强制执行属性在那里使用Select-Object。
Out-GridView与Format-Table
的行为相同,也会跳过NoRemove
为什么?
注意:这是来自一个受限制较少的Where-Object
子句,看起来Format-Table
检测的不仅仅是数组中的第一个对象来猜测列。
该示例来自Channel 9 how-to: Print/List installed programs/applications sorted by date,忘记将第一个Get-ItemProperty
(gp
)初始化为数组,因此您收到如下错误:
Method invocation failed because [Microsoft.Win32.RegistryKey] doesn't contain a method named 'op_Addition'.
示例代码:
$nonUninstallableSoftwareRegistryKeys = (@(Get-Item HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*)) +
(Get-Item HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*) +
(Get-Item HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*) |
Where-Object { $_.ValueCount -eq 1 }
$nonUninstallableSoftwareRegistryKeys.GetType().FullName
$nonUninstallableSoftwareRegistryKeys | Get-Member
$nonUninstallableSoftwareRegistryNameValues = $nonUninstallableSoftwareRegistryKeys |
Get-ItemProperty
$nonUninstallableSoftwareRegistryNameValues.GetType().FullName
$nonUninstallableSoftwareRegistryNameValues | Get-Member
$nonUninstallableSoftwareRegistryNameValues |
Format-Table
$nonUninstallableSoftwareRegistryNameValues |
Format-List
$nonUninstallableSoftwareRegistryNameValues |
Select-Object SystemComponent, NoRemove, PSPath, PSParentPath, PSChildName, PSProvider |
Format-Table
我使用GetType()。FullName和Get-Member来检查基础类型。
$nonUninstallableSoftwareRegistryKeys
从所有已安装的软件(用户,系统x64和系统x86)开始,这些软件仅通过只有1个值的注册表项进行过滤(根据经验,这些是您无法卸载的)。
输出的第一部分显示$nonUninstallableSoftwareRegistryKeys
是类型Microsoft.Win32.RegistryKey的System.Object[]
,其中包含所有正确的成员。因此,即使代码完成没有显示,也可以在Where-Object属性上执行ValueCount过滤器。
$nonUninstallableSoftwareRegistryKeys
还公开了一些PowerShell "Extended Type System" NoteProperty
属性,包括Property
,其中包含密钥下的注册表名称/值对以及来自注册表提供程序的一堆PS*
。
$nonUninstallableSoftwareRegistryNameValues
也是System.Object[]
但现在属于类型
System.Management.Automation.PSCustomObject因为Get-ItemProperty将每个Property
项的$nonUninstallableSoftwareRegistryKeys
中的名称/值对扩展为属性。对于输出中的第一项,它会添加SystemComponent属性。对于第二项,它会添加NoRemove。它增加了一堆来自注册管理机构提供商的PS*
。
Format-Table
输出:
SystemComponent PSPath PSParentPath
--------------- ------ ------------
1 Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\Connection Manager Microsoft.PowerShell.Core\Registr...
Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\WIC Microsoft.PowerShell.Core\Registr...
1 Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Connection Manager Microsoft.PowerShell.Core\Registr...
Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\WIC Microsoft.PowerShell.Core\Registr...
Format-List
输出:
SystemComponent : 1
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\Connection Manager
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
PSChildName : Connection Manager
PSProvider : Microsoft.PowerShell.Core\Registry
NoRemove : 1
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\WIC
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
PSChildName : WIC
PSProvider : Microsoft.PowerShell.Core\Registry
SystemComponent : 1
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Connection Manager
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
PSChildName : Connection Manager
PSProvider : Microsoft.PowerShell.Core\Registry
NoRemove : 1
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\WIC
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
PSChildName : WIC
PSProvider : Microsoft.PowerShell.Core\Registry
Select-Object
输出:
SystemComponent NoRemove PSPath PSParentPath
--------------- -------- ------ ------------
1 Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\Connection Manager Microsoft.PowerShell.Cor...
1 Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\WIC Microsoft.PowerShell.Cor...
1 Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Connection Manager Microsoft.PowerShell.Cor...
1 Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\WIC Microsoft.PowerShell.Cor...
编辑:我的环境
PS C:\Users\Developer> Get-CimInstance Win32_OperatingSystem | Select-Object Version, Caption | Format-List
$PSVersionTable
Version : 6.2.9200
Caption : Microsoft Windows 8 Pro
Name Value
---- -----
PSVersion 3.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.18051
BuildVersion 6.2.9200.16628
PSCompatibleVersions {1.0, 2.0, 3.0}
PSRemotingProtocolVersion 2.2
这两个返回相同的表:
$nonUninstallableSoftwareRegistryNameValues |
Format-Table
$nonUninstallableSoftwareRegistryNameValues |
Format-Table *
答案 0 :(得分:5)
如果您没有为所有属性名称或'*'指定,Format-Table
默认情况下会打印前4个(默认值$FormatEnumerationLimit
),而不是为什么你在ft输出中只获得三个。仅当对象类型没有Format-List
的格式视图时,Format-List
才会显示所有内容。
答案 1 :(得分:0)
您是否尝试过以下操作?
$nonUninstallableSoftwareRegistryNameValues |
Select-Object SystemComponent, NoRemove, PSPath, PSParentPath, PSChildName, PSProvider |
Format-Table -Wrap