为什么这两个代码片段的行为不同?这是一个错误吗? (PS 版本 = 5.1.22621.2506,PS 版本 = 桌面版)
## Code Snippet #1
rmdir -recurse org
mkdir org\dir1
Get-ChildItem org -Directory | foreach { $_.GetType() }
对
## Code Snippet #2
rmdir -recurse org
mkdir org\dir1 | Out-Null
Get-ChildItem org -Directory | foreach { $_.GetType() }
两者之间的唯一区别是,在代码片段 2 中,
mkdir
的输出通过管道传输到 Out-Null。第二个片段(及其变体,如$null = mkdir org/dir1
)按我的预期工作:
Get-ChildItem org -Directory | foreach { $_.GetType() }
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DirectoryInfo System.IO.FileSystemInfo
但是当未捕获 mkdir 输出时(如代码片段 1 中所示),Get-ChildItem 会执行一些意想不到的操作:
Get-ChildItem org -Directory | foreach { $_.GetType() }
Directory: C:\Users\Phil\ps\as1\org
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 4/10/2024 12:56 AM dir1
Module : CommonLanguageRuntimeLibrary
Assembly : mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
TypeHandle : System.RuntimeTypeHandle
DeclaringMethod :
BaseType : System.IO.FileSystemInfo
UnderlyingSystemType : System.IO.DirectoryInfo
FullName : System.IO.DirectoryInfo
AssemblyQualifiedName : System.IO.DirectoryInfo, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
[: : :]
如果使用
New-Item
而不是 mkdir
,会看到相同的结果。我不明白为什么(甚至如何)目录结构可能会有所不同,具体取决于在创建过程中是否捕获输出。
这种行为 - 只是一个 显示 问题 - 可能会令人惊讶,但这是设计使然:
如果管道中的第一个输出对象触发基于显式定义的格式定义的基于表的显示格式,则不同类型的后续输出对象将被强制为列表格式。