【问题标题】:How do I do 'dir /s /b' in PowerShell?如何在 PowerShell 中执行“dir /s /b”?
【发布时间】:2010-12-01 13:38:09
【问题描述】:

我有一个包含三个文件的文件夹,并且想要 PowerShell 中的 dir /s /b 等效项。我该怎么做?

例如,如果文件夹名称为 temp3,并且它包含三个文本文件 - a.txtb.txtc.txt,正在做

C:\temp3> dir /s /b

给我

C:\temp3\a.txt
C:\temp3\b.txt
C:\temp3\c.txt

如何在 PowerShell 中获得相同的结果?

【问题讨论】:

  • dir -s -n -- 未记录 -s 也是递归的。 -n 只给出名称,但没有驱动器号(如果你能接受的话)
  • 欢迎来到 SO 怪诞秀;)我首先必须找出这两个标志是什么。所以 /s 表示以递归方式列出文件,而 /b 只是文件。

标签: powershell


【解决方案1】:

Bob 答案的一个变体是使用管道进行实时输出(在大目录中有更好的反馈):

dir -r | % FullName

【讨论】:

    【解决方案2】:

    这是等价的:

    (dir -r).FullName
    

    【讨论】:

      【解决方案3】:

      只是为了强制执行,乔伊所说的:

      gci -r -filter *.log | % fullname
      

      这可以找到像dir /s/b *.log 这样的文件。


      (dir -r *.log).FullName 也可以


      在你的 powershell shell 中执行一次,以启用dirsb *.log 命令:

      function global:dirsb {
          param ([Parameter(Mandatory=$true)][string]$fileFilter)
          gci -r -filter $fileFilter | % fullname
      }
      

      或将其添加到您的个人资料中:PS> notepad $profile

      【讨论】:

        【解决方案4】:

        如果您只想通过调用 cmd dir 永久替换 Powershell 的 dir 别名 (Get-ChildItem),那么对于您要打开的所有未来的 powershell 窗口,只需执行以下操作:

        1. 记事本 $profile(来自 powershell 窗口)
        2. 文件打开时,插入以下行并保存:

          Remove-Item alias:\dir
          function dir($1, $2, $3, $4) {cmd /r dir $1 $2 $3 $4}
          

        【讨论】:

          【解决方案5】:

          如果您将 Powershell 用作 shell(而不是脚本处理器),您只需键入:

          cmd /r dir /s /b
          

          /r 标志告诉cmd.exe 运行命令并退出。换句话说,您将在相同的执行上下文中结束。

          对于许多命令,cmd /r 比处理 Powershell 面向对象的架构更好。

          【讨论】:

          • 我觉得很讽刺的是,在 powershell 中编写命令的最短方法就是将 shell 退回到旧的cmd.exe。 PowerShell 是一个臃肿、笨重的烂摊子。 DOS,尽管有它的缺点,但它是高效的。
          • @abelenky gci -r | % FullName 看起来很短,可以说比dir 标志更容易记住
          • @abelenky +1,由臃肿引起的附加属性 - 它很慢。
          • 我从未见过/R,直到我看到这个才在cmd的选项列表中找到另外,出于兼容性原因,/X与/E相同:开,/Y/E:OFF 相同,/R/C 相同。任何其他开关都将被忽略。 所以最好使用/C/K
          • ... 或 cmd /c .. (最后两个点是为了能够写这些东西。
          【解决方案6】:

          你可以使用

          Get-ChildItem -Recurse | Select-Object -ExpandProperty FullName
          gci -r | select -exp FullName
          

          Get-ChildItem -Recurse | ForEach-Object { $_.FullName }
          gci -r | % { $_.FullName }
          gci -r | % FullName    # In recent PowerShell versions
          

          (长版本是第一个,使用别名和短参数名称缩短的版本是第二个,如果不明显的话。在脚本中,我建议始终使用长版本,因为它不太可能在某处发生冲突。 )

          重新阅读您的问题,如果您想要使用dir /s /b 完成的只是输出当前目录中文件的完整路径,那么您可以在此处删除-Recurse 参数。

          不过,我对您的建议是:如果可以,请不要使用字符串。如果你想传递文件,那么只需获取从Get-ChildItem 获得的FileInfo 对象。 cmdlet 知道如何处理它。在对象工作得更好的地方使用字符串只会让你陷入奇怪的问题。

          【讨论】:

          • 你也可以这样做:gci -r |选择-展开全名
          • @Johannes:确实有效。你使用v2 final?见blogs.msdn.com/powershell/archive/2009/09/14/…
          • 嗯,不,我很惭愧我在 v1 中查找了它(我在我附近唯一仍然有 v1 的机器上)。我什至读过那篇博文,但不记得了。
          • 您可能还想过滤 Get-ChildItem -Recurse |选择对象-ExpandProperty FullName | Where-Object { $_ -like "*.log" }
          • @aolszowka:在Get-ChildItem 中过滤会更快,例如与-Filter *.log。此外,这不是问题的一部分。
          【解决方案7】:

          补充乔伊的答案。从 PowerShell 3.0 开始,您可以使用新的 Foreach-Object 简写来获取 FullName 属性。

          Get-ChildItem -Recurse | Foreach-Object FullName
          gci -r |% FullName
          

          不同之处在于,如果您只需要一个属性,则不需要使用花括号 ({}) 或 $_ 变量。

          【讨论】:

          • 终于!避免虚假空行的一种真正方法!
          • 这似乎是最直观的答案。
          猜你喜欢
          • 1970-01-01
          • 2012-06-28
          • 2011-07-29
          • 2013-02-18
          • 2021-06-25
          • 1970-01-01
          • 2021-12-14
          • 2011-09-06
          • 2013-07-24
          相关资源
          最近更新 更多