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

5

如何使用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命令可以实现我想要的功能?

1个回答

6
在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本地别名gci。要查看所有针对Get-ChildItem定义的别名,请运行:
Get-Alias -Definition Get-ChildItem 请注意,使用PowerShell的>重定向运算符(实际上是Out-File cmdlet的别名)将导致输出文件files.txt被包含在枚举中,就像在cmd.exe和类似POSIX的shell(如bash)中一样,因为目标文件是首先创建的。
相比之下,使用带有Out-File的管道(或用于文本输入的Set-Content)会延迟文件创建,直到在此单独管道段中初始化了该cmdlet [1] - 并且因为第一段的文件枚举在此时已经完成定义,由于Get-ChildItem调用被包含在(...)中,因此输出文件不会包括在枚举中。
还要注意,.BaseName属性访问应用于(Get-ChildItem ...)返回的所有文件,这方便地导致了返回每个单独文件的属性值数组,由于一个名为member-access enumeration的功能。
字符编码注释:
  • 在Windows PowerShell中,Out-File/>创建“Unicode”(UTF-16LE)文件,而Set-Content使用系统的传统ANSI代码页。

  • 在PowerShell(Core)7+中,默认情况下使用无BOM的UTF-8。

可以使用-Encoding参数来显式控制编码。
[1] 对于Set-Content而言,实际上可以更进一步地延迟,即直到接收到第一个输入对象,但是不应该依赖这一实现细节。

1
非常好的答案。感谢您提供详细的解释。最终我使用了(Get-ChildItem -File).BaseName | Out-File files.txt -Encoding utf8,因为对于我来说UTF-8编码很重要。感谢您指出-Encoding参数。 - GTS Joe
3
很高兴听到它对你有帮助,@GTSJoe;这是我的荣幸,感谢你提出一个思路清晰的问题。请查看我最新的有关别名和称为_member enumeration_功能的更新。 - mklement0

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