我如何在PowerShell中执行'dir/s/b'?

35 powershell

我有一个包含三个文件的文件夹,并希望dir /s /b在PowerShell中具有相同的功能.我怎么做?

例如,如果文件夹名称是temp3,它包含三个文本文件 - a.txt.b.txtc.txt,做

C:\temp3> dir /s /b
Run Code Online (Sandbox Code Playgroud)

给我

C:\temp3\a.txt
C:\temp3\b.txt
C:\temp3\c.txt
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*oey 32

您可以使用

Get-ChildItem -Recurse | Select-Object -ExpandProperty FullName
gci -r | select -exp FullName
Run Code Online (Sandbox Code Playgroud)

要么

Get-ChildItem -Recurse | ForEach-Object { $_.FullName }
gci -r | % { $_.FullName }
gci -r | % FullName    # In recent PowerShell versions
Run Code Online (Sandbox Code Playgroud)

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

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

不过我给你的建议是:当你可以帮助时,不要使用字符串.如果你想传递文件,那么只需要FileInfo获取你得到的对象Get-ChildItem.cmdlet知道如何处理它.使用字符串来处理对象更好的工作只会让你陷入奇怪的问题.


fer*_*olo 32

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

cmd /r dir /s /b
Run Code Online (Sandbox Code Playgroud)

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

对于许多命令,cmd /r优于处理Powershell面向对象的体系结构.

  • 我觉得很有讽刺意味的是,在powershell中编写命令的最短路径就是回到旧的`cmd.exe`.PowerShell是一个臃肿,笨重的混乱.尽管如此,DOS仍然是有效的. (9认同)
  • @abelenky`gci -r | %FullName`似乎很短,可以说比'dir`标志更容易记住 (2认同)

小智 11

这是等价的:

(dir -r).FullName
Run Code Online (Sandbox Code Playgroud)


cbu*_*art 11

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

dir -r | % FullName
Run Code Online (Sandbox Code Playgroud)


Rya*_*ose 5

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

Get-ChildItem -Recurse | Foreach-Object FullName
gci -r |% FullName
Run Code Online (Sandbox Code Playgroud)

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


Ban*_*cid 5

只是为了执行,乔伊说了什么:

gci -r -filter *.log | % fullname
Run Code Online (Sandbox Code Playgroud)

这样可以像查找文件一样查找文件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
}
Run Code Online (Sandbox Code Playgroud)

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


ron*_*y l 5

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

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

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