Powershell 相当于 Linux 的: ls -al

but*_*j10 12 linux powershell ls

我不经常使用 Powershell 或 Linux,所以我不确定: ls -al 在 Powershell“术语”中是什么。我试图找到一些东西,但它说 Powershell 中没有等效的命令。看起来很奇怪,所以我想我应该尽快问一下。

mkl*_*nt0 19

您正在使用的 Unix 实用程序选项ls

  • -a选项包括隐藏项目,在类 Unix 平台上是文件系统项目,其名称以.

  • -l请求所谓的长格式,它生成表格输出,其中包括文件系统项目的模式、用户和组所有权、上次写入时间戳、项目大小及其名称。

PowerShell等效项是:

Get-ChildItem -Force
Run Code Online (Sandbox Code Playgroud)
  • Get-ChildItem-Forceswitch在输出中包含隐藏ls项目 - 尽管与 with 不同,表示目标目录本身及其父目录的.和条目包括在内(这使其相当于更有用的选项)。..-A ls

  • 默认情况下使用相当于长格式的格式化;相反,如果您仅对文件名(相对路径)感兴趣,请使用该开关。-Name

  • 注意:默认情况下,Get-ChildItem目标是当前位置(目录);要显式指定输入路径,请使用参数-Path- 对于通配符模式 - 或-LiteralPath参数 - 对于文字(逐字)路径。第一个位置参数(不以参数名称为前缀)隐式绑定到-Path; 例如,以下命令针对当前用户的主目录:

    Get-ChildItem -Force -LiteralPath $HOME
    
    Run Code Online (Sandbox Code Playgroud)

请参阅底部部分以缩短此命令定义一个方便的“别名”(函数)


然而,和 之间有一个根本区别:lsGet-ChildItem

  • ls输出格式化文本,因此通常不鼓励解析其输出。

  • 在 PowerShell 中,格式与数据分离,输出的是对象,而不是字符串

    • 也就是说,无论终端中输出的显示格式如何丰富,其实际输出都是和类型的对象如果在变量中捕获,通过管道发送到其他 PowerShell 注释,可以安全地用于进一步的编程处理,或者用在表达式中。Get-ChildItemSystem.IO.FileInfoSystem.IO.DirectoryInfo
  • 例如,表达式(Get-ChildItem -Force).FullName输出当前目录中所有项目的完整路径。


为了交互方便(您不应该在脚本中这样做),您可以使用内置别名明确的参数名称前缀缩短命令

gci -fo
Run Code Online (Sandbox Code Playgroud)

gci是 的内置别名Get-ChildItem,其名称遵循 PowerShell 的命名约定,其中每个所谓的已批准动词也有一个已批准的 1-2 个字母别名形式;运行Get-Verb Get显示批准的Get动词的别名形式是g; 虽然名词部分没有正式规定,但记住 thatci代表的意思ChildItem应该很容易。

-fo是明确引用开关的最短参数名称前缀-Force(单独-f也可以引用-Filter[1]

  • 注意:有些参数本身有实际的别名,例如-hfor-Hidden-adfor -Directory,但-Force实际上没有。
  • 与明确的参数名称前缀不同,如果将新参数添加到命令中,随着时间的推移,参数名称前缀可能会变得模糊,参数别名可以安全地在脚本中使用,尽管为了可读性,最好使用全名。

要查看为给定命令定义的所有Get-ChildItem别名(在此示例中):

PS> Get-Alias -Definition Get-ChildItem

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           dir -> Get-ChildItem                                          
Alias           gci -> Get-ChildItem                                          
Run Code Online (Sandbox Code Playgroud)

要将输出限制为内置别名,即排除其他模块或$PROFILE脚本定义的别名,请运行pwsh -noprofile { Get-Alias -Definition Get-ChildItem }(在 Windows PowerShell 中,使用powershell而不是pwsh.

  • 上面显示了macOS 和 Linux上的输出。
  • Windows上,您将看到这ls另一个内置别名
    • 这是PowerShell 是仅限 Windows 的 shell 时的遗留别名,最好避免

      • 一般来说,别名优先于同名的外部程序,并且隐藏(覆盖)平台的标准命令行实用程序并不是一个好主意;虽然这不适用于lsWindows 上的别名,但在其他情况下却适用,即where(shadows where.exe) 和sc(Windows PowerShell-only, Shadows sc.exe)

      • 具体来说,考虑到真正的lsUnix 实用程序Get-ChildItem具有如此巨大的不同语法(和行为),将后者暴露为ls可能会引起混乱。

因此,建议坚持使用PowerShell命令名称缩写形式的别名,例如gciforGet-ChildItemgcforGet-Content。虽然这最初并不能帮助从ls/dir和 等熟悉的名称进行转换cat,但 PowerShell cmdlet 名称及其缩写别名是系统化且基于约定的,这一事实使得以后更容易记住它们。

使用预设参数定义一个方便的“别名”function

POSIX 兼容的 shell,例如允许您使用预设bash参数定义别名,例如alias ll='ls -al'

相比之下,PowerShell 中的别名仅仅是名称映射,您需要声明一个函数(您可以将其添加到$PROFILE文件中以便在将来的会话中使用):

# Equivalent of bash alias `alias ll='ls -al'`
function ll { ls -al @args }
Run Code Online (Sandbox Code Playgroud)

或者,基于以下的类似gcih函数(h表示隐藏Get-ChildItem) :

function gcih { Get-ChildItem -Force @args }
Run Code Online (Sandbox Code Playgroud)

有关 PowerShell 中别名与函数的更多信息,请参阅此答案,包括如何创建更复杂的包装函数。


[1]从概念上讲,它也可以指-File参数,但从技术上讲,后者是一个动态参数,特定于 PowerShell 的文件系统提供程序,因此在歧义性检查期间不会被考虑。