如何在 Powershell 中生成类似 Linux 的 `ls` 输出?

Guo*_*uai 13 windows powershell

我不希望ls( Get-ChildItem)的输出在 Powershell 中是垂直的(一个文件一行)。我希望它是水平的(就像 Linux 中的表格)。在网上搜索后,我不知道该怎么做。

并且ls -n | Format-Table不起作用。它仍然是垂直的。

我的母语不是英语,所以请原谅我的一些语法错误。

Mat*_*son 10

如果您安装了适用于 Linux 的 Windows 子系统 (WSL),则可以ls直接调用。

打字

wsl ls 
Run Code Online (Sandbox Code Playgroud)

实际上调用 linux ls 命令并为您提供与在 linux 上找到的相同输出。

您可以更新“ls”别名,以便它始终使用 Powershell 的“Set-Alias”来调用它。在 Powershell 配置文件 (Microsoft.PowerShell_profile.ps1) 中执行以下操作:

function ls_alias { wsl ls --color=auto -hF $args }
Set-Alias -Name ls -Value ls_alias -Option AllScope
Run Code Online (Sandbox Code Playgroud)

这还允许您传入其他参数,例如显示所有文件:

ls -a
Run Code Online (Sandbox Code Playgroud)

但请注意:您必须传入 Unix 样式的路径,而不是 Windows 路径,否则将无法识别。例如,这个:

ls /mnt/c/tmp/my_file
Run Code Online (Sandbox Code Playgroud)

但不是:

ls C:\tmp\my_file
Run Code Online (Sandbox Code Playgroud)


pos*_*ote 7

我不确定您为什么要在 Windows 上执行此操作或期望在 Windows 上列出 Linux 文件系统。然而,这已经接近尾声了,因为它本身就带有 Windows PowerShell。

#Collect the path listing, split on the line feed, join with a space delimiter 
(ls -n) -split "`n" -join " "
Run Code Online (Sandbox Code Playgroud)

Windows 文件系统只是按照设计本身不会以这种方式列出文件,Windows PowerShell 的目标不是模仿其他操作系统的文件系统所做的。Windows 文件系统将使用其原生的单个字符串列表,设计而不是 *NIX 中的类似表格的视图。文件或目录也没有颜色突出显示。

在你问之前,不,你不能只对我展示的内容使用 Format-Table。如果您想要这种外观,那么您需要为 LS/GCI 编写自己的包装器,或者在 *NIX 或 OSX 上使用 PoSHv6,或者使用其他响应中指出的“ls”端口,或者如果您使用的是 Win10,请启用 WSL( Linux 上的 Bash),只需使用 WSL 而不是 Win PoSH。

您当然也可以只选择文件或目录列表。

(ls -n -directory) -split "`n" -join " "

(ls -n -file) -split "`n" -join " "
Run Code Online (Sandbox Code Playgroud)

您可以使用 Format-Wide cmdlet,具体取决于您使用的 PoSH 版本。

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/format-wide?view=powershell-6

ls | Format-Wide -Column 5
Run Code Online (Sandbox Code Playgroud)

但是你不能做的是...

ls -n | Format-Wide -Column 5
Run Code Online (Sandbox Code Playgroud)

...它会失败,没有解决方法。

你必须做这样的事情......工作。

ls | Format-Wide -Column 5 -Property Name
Run Code Online (Sandbox Code Playgroud)

...因为它是执行此操作的 Format-Wide cmdlet

  • 投反对票是因为答案的“为什么要模仿 Linux”部分是不必要的。OP 的问题显然是关于获得更紧凑的输出格式。 (5认同)
  • 仅仅因为您的答案在技术上有用并不意味着 sass 是必要的,因此 @jmlorenzi 的评论得到了高度评​​价。我遇到这个问题是因为我正在尝试执行“快速”目录列表以获取大量文件名列表,然后继续。在 Unix 中,对我来说“惰性等价物”是 `ls *.yaml` ;但在 PowerShell 中执行此操作的方法并不明显。 (4认同)

Mat*_*son 5

尝试这个命令:

Get-ChildItem $args -Exclude .*  | Format-Wide Name -AutoSize
Run Code Online (Sandbox Code Playgroud)

您始终可以在 Powershell 配置文件 (Microsoft.PowerShell_profile.ps1) 中添加别名:

function l { Get-ChildItem $args -Exclude .*  | Format-Wide Name -AutoSize }
Run Code Online (Sandbox Code Playgroud)

或者,如果您也想查看隐藏文件:

Get-ChildItem $args -Force | Format-Wide Name -AutoSize
Run Code Online (Sandbox Code Playgroud)

如果您想知道这里发生了什么,这些是基本的 Powershell 命令。是和Get-ChildItem的基本命令。获取一个列表并格式化它。dirlsFormat-Wide

  • 使用别名,您可以将其缩短为“ls -dir |” fw Name -a` 甚至 `ls -dir | 固件-a` (2认同)