是否有一种在PowerShell中模拟Linux ls -l
命令行为的方法?
我想知道符号链接指向哪里,具体来说,我使用了PowerShell的New-Symlink
实用程序,我想知道磁盘上的-Path在哪里。
(是的,我知道-Path因为我自己创建了它,但我在其他几个场合中也想要一个ls -l
等价物。)
是否有一种在PowerShell中模拟Linux ls -l
命令行为的方法?
我想知道符号链接指向哪里,具体来说,我使用了PowerShell的New-Symlink
实用程序,我想知道磁盘上的-Path在哪里。
(是的,我知道-Path因为我自己创建了它,但我在其他几个场合中也想要一个ls -l
等价物。)
自PowerShell v.6及以上版本,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
dir
显示符号链接,但它不会显示链接的目标。要显示链接的目标,您有两个选项。第一种是使用fsutil reparsepoint query
或从命令提示符使用dir
。它们都有缺点。第一个将以十六进制数据的形式提供目标路径,而第二个必须从命令提示符运行,因为Powershell别名dir
为Get-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