powershell 中的 select 行为

powershell 中的 select 行为

有人可以解释一下为什么会这样(powershell 2.0)

$wmi=Get-WmiObject Win32_UserProfile
$wmi|select *;
$wmi|select SID;
$wmi|select LocalPath;

给出了预期的结果(选择了所有内容,然后选择了 SID,然后选择了 LocalPaths),而这两个给出了

$wmi=Get-WmiObject Win32_UserProfile
$wmi|select LocalPath;
$wmi|select SID;
$wmi|select LocalPath;

LocalPaths,无,LocalPaths

Get-WmiObject Win32_UserProfile|select SID;
"separator";
gwmi win32_UserProfile|select LocalPath;
"separator"
gwmi Win32_UserAccount|select *;

SID,什么都没有,再次是 SID 是否只有一个 select 实例?

答案1

您遇到了 powershell 中输出格式奇怪的情况。请参阅Jeffrey Snover 对此问题进行了描述。

我只能在一行中运行所有命令时重现此行为,如下所示:

$wmi=Get-WmiObject Win32_UserProfile; $wmi | select localpath;$wmi|select SID; $wmi | select localpath

这一定是(这里推测)因为整行是作为批处理提交给 Out-Default 的;如果单独运行每个命令,则看不到这种行为。

但是,通过一次对 Out-Default 的调用,它首先看到具有一个属性“LocalPath”的 Selected.System.Management.ManagementObject,因此它为“LocalPath”创建了一个只有一列的表。一旦您获得一些具有“SID”属性的 Selected.System.ManagementObjects,它们就会在表中显示为空,因为它们的“LocalPath”属性(Format-Table 知道要显示的唯一属性)为空。

这个问题在第一个例子中不会发生,因为 'select *' 导致 Out-Default 选择 Format-List 作为格式化程序,其损耗要小得多。

我希望这会有所帮助——我链接的博客文章对此解释得很好。

相关内容