将文件夹中的文件名输出到文本文件

Output Filenames in a Folder to a Text File

使用 Windows 命令提示符或 Windows PowerShell,如何将单个目录中的所有文件名输出到一个文本文件,不带文件扩展名?

在命令提示符中,我使用的是:

dir /b > files.txt

结果

01 - Prologue.mp3
02 - Title.mp3
03 - End.mp3
files.txt

期望的输出

01 - Prologue
02 - Title
03 - End

注意“dir /b > files.txt”命令包含文件扩展名并将文件名放在底部。

在不使用批处理文件的情况下,是否有干净的命令提示符或 PowerShell 命令可以执行我正在寻找的操作?

在 PowerShell 中:

# Get-ChildItem (gci) is PowerShell's dir equivalent.
# -File limits the output to files.
# .BaseName extracts the file names without extension.
(Get-ChildItem -File).BaseName | Out-File files.txt

注意:您也可以在 PowerShell 中使用 dir,它只是 Get-ChildItem 的别名。但是,为了避免与语法根本不同的 cmd.exe 内部命令 dir 混淆,最好使用 PowerShell-native 别名 gci。查看为 Get-ChildItem、运行
Get-Alias -Definition Get-ChildItem

定义的所有别名

请注意,使用 PowerShell 的 > 重定向运算符 - 它实际上是
Out-File cmdlet 的别名 - 也会导致不希望包含的输出,files.txt,在枚举中,如cmd.exe和POSIX-like shell如bash,因为目标文件是先.

相比之下,使用带有 Out-File 的管道(或 Set-Content, for text input) delays file creation until the cmdlet in this separate pipeline segment is initialized[1] - and because the file enumeration in the first segment has by definition already completed by that point, due to the Get-ChildItem 调用包含在 (...) 中,输出文件是 而不是 包含在枚举中。

另请注意,属性 访问 .BaseName 已应用于 所有 (Get-ChildItem ...) 返回的文件,这很方便地生成了一个数组由于称为 member-access enumeration.

的功能,单个文件的 属性 值被返回

Character-encoding 注:

  • 在 Windows PowerShell 中,Out-File / > 创建“Unicode” (UTF-16LE) 文件,而 Set-Content 使用系统的旧版ANSI 代码页。

  • 在 PowerShell (Core) 7+ 中,BOM-less UTF-8 是一致的默认值。

-Encoding 参数可用于显式控制编码。


[1] 在 Set-Content 的情况下,它实际上被延迟得更久,即直到接收到第一个输入对象,但这是一个不应该被延迟的实现细节靠。