Windows PowerShell中等同于Linux `ls -l`的命令

13

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

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

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

2个回答

7

自PowerShell v.6及以上版本,Get-ChildItem已经内置了显示符号链接及其目标位置的功能。

Get-ChildItem文档

如果要模拟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不会显示。如果文件是符号链接,将在Mode列中显示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

输出结果如下: 在此输入图片描述

太好了,这对我很有帮助。我想知道如何将终端图标添加到输出中,这可行吗? - undefined

3
似乎PowerShell没有本来支持这个。这里有一篇文章,介绍了如何在PowerShell中使用dir显示符号链接,但它不会显示链接的目标。要显示链接的目标,您有两个选项。第一种是使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接