一个列出目录下所有文件和文件夹的PowerShell脚本

10

我一直在寻找一个脚本,可以递归地打印目录内所有文件和文件夹,使用反斜杠来表示文件夹:

Source code\
Source code\Base\
Source code\Base\main.c
Source code\Base\print.c
List.txt

我正在使用PowerShell 3.0,但大多数其他脚本都不能正常工作(尽管它们与我要求的内容不太一样)。

此外:我需要它是递归的。

9个回答

16
看起来你正在寻找一种区分文件和目录的方法。幸运的是,有一个叫做PSIsContainer的属性,对于目录来说它的值为true,对于文件来说则为false。
dir -r  | % { if ($_.PsIsContainer) { $_.FullName + "\" } else { $_.FullName } }

C:\Source code\Base\
C:\Source code\List.txt
C:\Source code\Base\main.c
C:\Source code\Base\print.c

如果不需要前导路径信息,您可以使用-replace轻松地将其删除。
dir | % { $_.FullName -replace "C:\\","" }

1
@Guvante 在正则表达式中\必须被转义!-replace的第一个参数是一个正则表达式!! - CB.
3
感叹号使其更正确。http://knowyourmeme.com/memes/the-1-phenomenon - EBGreen
@EBGreen很不幸,我无法编辑我的评论,在我的感叹号后面添加一些“一个” ;) - CB.
很遗憾,这个脚本不是递归的。如何修复? - Melab
你能否编辑它,使得它不会打印出进程所在文件夹的名称(List.txt不在源代码中),并且按照Windows资源管理器的方式进行排序,即将文件夹放在前面。 - Melab

5
它可能是这样的:

它可以像这样:

$path = "c:\Source code"
DIR $path -Recurse | % { 
    $_.fullname -replace [regex]::escape($path), (split-path $path -leaf)
}

根据 @Goyuix 的想法:

$path = "c:\source code"
DIR $path -Recurse | % {
    $d = "\"
    $o = $_.fullname -replace [regex]::escape($path), (split-path $path -leaf)
    if ( -not $_.psiscontainer) {
        $d = [string]::Empty 
    }
    "$o$d"
}

@Melab 在你的脚本中添加参数以传递路径,在所有答案中,路径都是硬编码的,为了方便起见...阅读有关如何创建带参数的PowerShell脚本的内容... - CB.
我该怎么做?我怀疑它是否会按正确的顺序排序。请看我对Goyux答案的评论。 - Melab

3

这个答案展示了完整的路径,就像其他答案一样,但更加简短:

ls -r | % { $_.FullName + $(if($_.PsIsContainer){'\'}) }

然而,我相信OP要求的是相对路径(即相对于当前目录),只有@C.B.的答案涉及到了这一点。因此,我们只需要添加一个substring函数就可以实现:

ls -r | % { $_.FullName.substring($pwd.Path.length+1) + $(if($_.PsIsContainer){'\'}) }

3

将目录列表导出到文本文件的 PowerShell 命令:

将完整路径目录列表(包括文件和文件夹)导出到文本文件中:

ls -r | % { $_.FullName + $(if($_.PsIsContainer){'\'}) } > filelist.txt

生成相对路径目录列表(文件夹和文件)到文本文件:

ls -r | % { $_.FullName.substring($pwd.Path.length+1) + $(if($_.PsIsContainer){'\'}) } > filelist.txt

3
dir | % {
   $p= (split-path -noqualifier $_.fullname).substring(1)
   if($_.psiscontainer) {$p+'\'} else {$p}
}

2

不是PowerShell,但您可以在命令提示符中使用以下内容将文件递归列出到文本文件中:

dir *.* /s /b /a:-d > filelist.txt

1
你可以通过PowerShell中的get-childitem命令实现此操作。请参考以下语法:
Get-ChildItem "文件夹名称或路径" -Recurse | select FullName > list.txt
这将帮助你将所有纯文件和文件夹名称递归地写入一个名为list.txt的文件中。更多信息请参考此链接:https://ss64.com/ps/get-childitem.html 虽然回答有些晚,但这可能会对某些人有所帮助!

0
(ls $path -r).FullName | % {if((get-item "$_").psiscontainer){"$_\"}else{$_}}

仅适用于 PS 3.0


0

我对提交的代码进行了改进(因为代码输出在 PowerShell 中有一个输出限制)

  1. 在你想要扫描文件和文件夹的文件夹中 Shift + 右键单击
  2. 复制并粘贴此内容(只需编辑 your_pc_name)

dir -r |% { if ($.PsIsContainer) { $.FullName + "" } else { $_.FullName } } | Out-File -FilePath c:\users\your_pc_name\desktop\OUTPUT.txt

这将把所有的文件和文件夹打印到你的桌面上的一个 txt 文件中。

额外提示:

  1. 复制输出并粘贴到 Excel 中
  2. 使用 Ctrl + F 查找所需的文件名。

这帮助我在搜索大量的文件数据库时很有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接