PowerShell中是否有某种方法可以模拟Linux ls -l
命令的行为?
我想看看符号链接指向的是什么。具体来说,我使用了PowerShell New-Symlink
实用程序,我想知道-Path在磁盘上的位置。
(是的,我知道-Path因为我自己创建了它,但我在其他几个场合都想要ls -l
等效。)
答案 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别名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
答案 1 :(得分:2)
在 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
未显示的文件所有者。如果文件是符号链接,它将在模式列中显示为 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