How do I do 'dir /s /b' in PowerShell?

后端 未结 7 566
梦毁少年i
梦毁少年i 2020-12-23 19:34

I have a folder with three files and want the equivalent of dir /s /b in PowerShell. How do I do that?

For example, if the folder name is temp3

相关标签:
7条回答
  • 2020-12-23 20:10

    If you just want to permanently replace Powershell's dir alias (Get-ChildItem) with a call to cmd dir, for all future powershell windows you're going to open just do the following:

    1. notepad $profile (from powershell window)
    2. when file opens, insert the following rows and save:

      Remove-Item alias:\dir
      function dir($1, $2, $3, $4) {cmd /r dir $1 $2 $3 $4}
      
    0 讨论(0)
  • 2020-12-23 20:13

    Just to enforce, what Joey said:

    gci -r -filter *.log | % fullname
    

    This works to find files like dir /s/b *.log does.


    (dir -r *.log).FullName works as well


    Execute this once in your powershell shell, to enable a dirsb *.log command:

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

    or add it to your profile: PS> notepad $profile

    0 讨论(0)
  • 2020-12-23 20:14

    Adding onto Joey's answer. Starting in PowerShell 3.0, you can use the new Foreach-Object shorthand to get the FullName property.

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

    The difference is that you don't need to use curly braces ({}) or the $_ variable if all you need is a property.

    0 讨论(0)
  • 2020-12-23 20:16

    You can use

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

    or

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

    (The long version is the first one and the one shortened using aliases and short parameter names is the second, if it's not obvious. In scripts I'd suggest using always the long version since it's much less likely to clash somewhere.)

    Re-reading your question, if all you want to accomplish with dir /s /b is to output the full paths of the files in the current directory, then you can drop the -Recurse parameter here.

    My advice to you, though: Don't use strings when you can help it. If you want to pass around files, then just take the FileInfo object you get from Get-ChildItem. The cmdlets know what to do with it. Using strings for things where objects work better just gets you into weird problems.

    0 讨论(0)
  • 2020-12-23 20:22

    A variation of Bob answer is to use a pipe for realtime output (having a better feedback in large directories):

    dir -r | % FullName
    
    0 讨论(0)
  • 2020-12-23 20:24

    This is equivalent:

    (dir -r).FullName
    
    0 讨论(0)
提交回复
热议问题