如何让PowerShell的dir命令像CMD一样显示所有符号链接目标?
问题:配置PowerShell使其显示符号链接的目标(与cmd的dir命令一致)
在Command Prompt(cmd.exe)中执行dir命令时,符号链接会直接显示目标路径:
C:\path\to\somewhere> dir 2022-10-03 20:17 <DIR> . 2022-10-03 19:54 <DIR> .. 2022-10-03 20:16 <SYMLINKD> link [..\target\]
但在PowerShell中执行dir(即Get-ChildItem的别名)时,仅能通过Mode中的l识别符号链接,无法直接看到目标路径:
PS C:\path\to\somewhere> dir Mode LastWriteTime Length Name ---- ------------- ------ ---- d----l 2022-10-03 20:16 link
以下是几种实现PowerShell显示符号链接目标的方法:
解决方案
方法1:临时调整输出格式(单次生效)
直接通过Format-Table自定义输出列,提取符号链接的目标路径:
Get-ChildItem | Format-Table Mode, LastWriteTime, Length, Name, @{Name='Target'; Expression={ if ($_.LinkType) { $_.Target } }} -AutoSize
如果仅需查看目录符号链接,可添加过滤条件:
Get-ChildItem -Directory | Format-Table Mode, LastWriteTime, Name, @{Name='Target'; Expression={ $_.Target }} -AutoSize
方法2:修改默认输出配置(永久生效)
通过编辑PowerShell配置文件,让dir/Get-ChildItem默认显示符号链接目标:
- 检查并创建配置文件(若不存在):
if (-not (Test-Path $PROFILE)) { New-Item -Path $PROFILE -ItemType File -Force }
- 打开配置文件进行编辑:
notepad $PROFILE
- 在配置文件中添加以下内容:
# 自定义Get-ChildItem输出格式,显示符号链接目标 $FormatEnumerationLimit = -1 Update-FormatData -AppendPath (Join-Path $PSScriptRoot 'CustomDir.format.ps1xml')
- 创建
CustomDir.format.ps1xml文件(与配置文件同目录),内容如下:
<?xml version="1.0" encoding="utf-8"?> <Configuration> <ViewDefinitions> <View> <Name>childitem</Name> <ViewSelectedBy> <TypeName>System.IO.DirectoryInfo</TypeName> <TypeName>System.IO.FileInfo</TypeName> </ViewSelectedBy> <TableControl> <TableHeaders> <TableColumnHeader> <Label>Mode</Label> <Width>7</Width> </TableColumnHeader> <TableColumnHeader> <Label>LastWriteTime</Label> <Width>20</Width> </TableColumnHeader> <TableColumnHeader> <Label>Length</Label> <Width>10</Width> </TableColumnHeader> <TableColumnHeader> <Label>Name</Label> </TableColumnHeader> <TableColumnHeader> <Label>Target</Label> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <TableColumnItems> <TableColumnItem> <PropertyName>Mode</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>LastWriteTime</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Length</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Name</PropertyName> </TableColumnItem> <TableColumnItem> <ScriptBlock> if ($_.LinkType) { $_.Target } else { '' } </ScriptBlock> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> </ViewDefinitions> </Configuration>
保存后重启PowerShell,执行dir即可默认看到符号链接的目标列。
方法3:自定义别名简化命令
若不想修改全局格式,可创建自定义命令别名,在$PROFILE中添加:
function Get-ChildItemWithLinkTarget { Get-ChildItem | Format-Table Mode, LastWriteTime, Length, Name, @{Name='Target'; Expression={ if ($_.LinkType) { $_.Target } }} -AutoSize } Set-Alias -Name dirwithlink -Value Get-ChildItemWithLinkTarget
之后执行dirwithlink就能快速查看带目标路径的目录列表。
内容的提问来源于stack exchange,提问作者goweon
相关产品推荐
相关产品推荐

