如果 Powershell 命令分隔符是 ;(分号),为什么“date; dir”会使 dir 输出额外的详细信息?

如果 Powershell 命令分隔符是 ;(分号),为什么“date; dir”会使 dir 输出额外的详细信息?

我知道分号是 Powershell 中的命令分隔符。 echo "hello"; dir给出此输出。

PS C:\> echo "hello"; dir
hello

Directory: C:\

Mode         LastWriteTime     Length Name
----         -------------     ------ ----
d-----       2018-04-29 13:02         BCD_Backup
d-----       2018-12-02 14:08         Dell
<snip>

但为什么会date; dir给出这样的输出?

PS C:\> date; dir

Friday, December 14, 2018 11:14:23

PSPath            : Microsoft.PowerShell.Core\FileSystem::C:\BCD_Backup
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::C:\
PSChildName       : BCD_Backup
PSDrive           : C
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : True
Name              : BCD_Backup
FullName          : C:\BCD_Backup
Parent            :
Exists            : True
Root              : C:\
Extension         :
CreationTime      : 2018-04-29 13:02:31
CreationTimeUtc   : 2018-04-29 11:02:31
LastAccessTime    : 2018-04-29 13:02:31
LastAccessTimeUtc : 2018-04-29 11:02:31
LastWriteTime     : 2018-04-29 13:02:31
LastWriteTimeUtc  : 2018-04-29 11:02:31
Attributes        : Directory
Mode              : d-----
BaseName          : BCD_Backup
Target            : {}
LinkType          :


PSPath            : Microsoft.PowerShell.Core\FileSystem::C:\Dell
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::C:\
<snip>

答案1

Out-Default文档

PowerShell 自动添加Out-Default 到每条管道的末端

当然,分号本身不足以识别这种状态:

Get-Alias -Name gal; Get-Location
CommandType     Name                                          Version    Source
-----------     ----                                          -------    ------
Alias           gal -> Get-Alias

Drive        : D
Provider     : Microsoft.PowerShell.Core\FileSystem
ProviderPath : D:\PShell
Path         : D:\PShell

添加Out-Default到管道明确解决了该问题:

Get-Alias -Name gal | Out-Default; Get-Location
CommandType     Name                                          Version    Source
-----------     ----                                          -------    ------
Alias           gal -> Get-Alias


Path
----
D:\PShell

答案2

由于 powershell 逐个执行语句,我认为它将第一个语句的输出格式应用于所有后续语句。

Get-Date返回类型为的对象时DateTime,它会被格式化为列表,从而影响您的“dir”输出。

您可以通过使用“格式”选项将返回类型更改Get-Date为字符串来测试这一假设:

date -Format yyyy-MM-dd ; dir

(这将产生‘dir’的默认输出)

或者通过管道方式更改默认输出格式Format-Table

 date | Format-Table ; dir

答案3

这似乎仅当您使用日期时才会发生;“之后的几乎任何其他内容”包括其他 PS cmdlet(刚尝试了几个)。

输入的“date”似乎正在调用核心 Windows(就像 cmd.exe 一样)来获取该日期字符串,PowerShell 正在尝试使用该字符串执行某些操作。

如果您将其反转,则“此处的任何内容”;日期不会出现这种奇怪的现象。它只是这样做......

 dir;date


    Directory: D:\Scripts


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         9/1/2018   2:12 PM                .vscode
d-----         7/3/2018   4:44 PM                CheckURI

....


DisplayHint : DateTime
Date        : 12/14/2018 12:00:00 AM
Day         : 14
DayOfWeek   : Friday
DayOfYear   : 348
Hour        : 14
Kind        : Local
Millisecond : 516
Minute      : 42
Month       : 12
Second      : 22
Ticks       : 636803953425164049
TimeOfDay   : 14:42:22.5164049
Year        : 2018
DateTime    : Friday, December 14, 2018 2:42:22 PM

相关内容