Windows PowerShell相当于Linux`ls -l`

时间:2015-04-27 04:41:22

标签: powershell ls

PowerShell中是否有某种方法可以模拟Linux ls -l命令的行为?

我想看看符号链接指向的是什么。具体来说,我使用了PowerShell New-Symlink实用程序,我想知道-Path在磁盘上的位置。

(是的,我知道-Path因为我自己创建了它,但我在其他几个场合都想要ls -l等效。)

2 个答案:

答案 0 :(得分:3)

似乎powershell不支持开箱即用。 Here's an article explaining how to use dir in PowerShell to show if there is a symbolic link, but it doesn't show the target of the link。要显示链接的目标,您有两个选择。首先使用fsutil reparsepoint query或从命令提示符处使用dir。两者都有缺点。第一个将目标路径作为十六进制数据提供,第二个必须从命令提示符运行,作为powershell别名dirGet-ChildItem,它不显示符号链接。

试试这个

Get-ChildItem | % { fsutil reparsepoint query $_ }
cmd /c dir /a:l

我能想出的最佳答案如下(如果需要,使用正则表达式匹配组提取更多信息):

$PATH="C:\tmp"
cmd /c dir $PATH | ? { $_ -match '([\d\.]+)\s+([\d:]+)\s+(\S+)\s+([^\[]+)\s*\[?([^\]]*)\]?' } | % { New-Object -TypeName PSCustomObject -Property @{Name=$matches[4];Target=$matches[5]}}

输出看起来与此类似

Target                                                      Name
------                                                      ----
                                                            .
                                                            ..
                                                            file.txt
C:\tmp\file.txt                                             symlink.txt

答案 1 :(得分:2)

在 PowerShell v. 6 及更高版本中,现在内置 Get-ChildItem 将显示与其目标位置的符号链接。

Get-ChildItem Docs

要模拟 Linux ls -l,您可以执行以下操作:

Get-ChildItem | Format-Table Mode, @{N='Owner';E={(Get-Acl $_.FullName).Owner}}, Length, LastWriteTime, @{N='Name';E={if($_.Target) {$_.Name+' -> '+$_.Target} else {$_.Name}}}

这与 ls -l 的列顺序匹配,并且还添加了 Get-ChildItem 未显示的文件所有者。如果文件是符号链接,它将在模式列中显示为 l,文件名显示如下:

filename.txt -> c:\Users\joe\filename.txt

这里是我的功能版本,我将其别名为 ll 并添加到我的个人资料中:

function Get-ChildItemUnix {
    Get-ChildItem $Args[0] |
        Format-Table Mode, @{N='Owner';E={(Get-Acl $_.FullName).Owner}}, Length, LastWriteTime, @{N='Name';E={if($_.Target) {$_.Name+' -> '+$_.Target} else {$_.Name}}}
}
New-Alias ll Get-ChildItemUnix