PowerShell 脚本仅导出没有文件扩展名的文件名列表,然后输出到每个目录单独的文本文件

标签 powershell powershell-2.0 powershell-3.0 powershell-ise

我需要一个 PowerShell 脚本来导出没有文件扩展名的文件名列表,然后输出到每个子文件夹单独的文本文件。我需要在脚本中指定一个父目录,然后 PowerShell 需要关闭并使用子文件夹的名称作为文本文件名(没有空格和小写)为每个子文件夹创建一个单独的文本文件。然后在创建的每个基于子文件夹的文本文件中,有一个包含在每个子文件夹中的文件名列表,没有文件扩展名。

$files = Get-ChildItem -Path "M:\Music" -Recurse `
| Where-Object {`
    $_.DirectoryName -notlike "*Other\Children" -and `
    $_.DirectoryName -notlike "*Other\Numbers" -and `
    $_.Extension -eq ".mp3"}
#Now loop through all the subfolders
$folder = $files.PSisContainer
ForEach ($Folder in $files)
{
$ParentS = ($_.Fullname).split("\")
$Parent = $ParentS[@($ParentS.Length - 2)]
Select-Object BaseName > C:\Users\me\Documents\$parent.txt
}

好的,花了一些时间在这上面,脚本被添加到之前的尝试中。这次似乎我非常接近,但是最后写入文本文件不是 100%,我之前使用的是 Out-File,它在每个文本文件的底部留下一个我不想要的空行。为什么我切换到 [system.io.file]::WriteAllText 和 [system.io.file]::AppendAllText,但是它们中的每一个都有自己的特质,不能满足我的需求。在文本文件中,我需要一列中没有空行的文件列表。
$files = Get-ChildItem -Path "M:\Music" -Recurse `
| Where-Object {`
    $_.DirectoryName -notlike "*Other\Children" -and `
    $_.DirectoryName -notlike "*Other\Numbers" -and `
    $_.Extension -eq ".mp3"}
#Now loop through all the subfolders
$folder = $files.Directory
ForEach ($Folder in $files)
{
$ParentS = ($folder.Fullname).split("\")
$ParentT = $ParentS[(@($ParentS.Length - 2))]
$Parent = $ParentT.replace(' ','')
[system.io.file]::WriteAllText("C:\Users\me\Documents\$parent.txt", $folder.BaseName,                                            [System.Text.Encoding]::Unicode)
}

最佳答案

这是展示 Powershell 和 .NET 协同工作的丰富性的好机会。

首先,获取文件夹所有子文件夹全名的最简单方法是使用如下一行:

$folders = (Get-ChildItem -Directory -Recurse M:\Music).FullName

-Directory 限制返回到 DirectoryInfo 对象数组的内容。通过利用 Powershell 仅返回 FullName 属性的能力,我们可以在一个语句中返回一组文件夹路径

只需多几行代码,我们就可以创建列出目录中歌曲的文件:
foreach ($folder in $folders)
{
    $fileBaseNames = (Get-ChildItem $folder\*.mp3).FullName | % {[System.IO.Path]::GetFileNameWithoutExtension($_)}
    $catalogFileName = (Split-Path $folder -Leaf) -replace ' ',''
    if ($fileBaseNames)  {Set-Content -Path $folder\$catalogFileName.txt -Value $fileBaseNames}
}

我们访问每个子文件夹,对于每个子文件夹,我们:
  • 获取当前目录中的 mp3 文件名数组(不带文件扩展名)。 (在这种情况下,我喜欢 .NET 的 GetFileNameWithoutExtension 方法。
  • 通过隔离当前文件夹名称 (Split-Path -Leaf) 并通过用空字符串替换每个空格来吸出所有空格,为我们的目录创建文件名。
  • 最后,如果我们的歌曲列表不为空,我们将使用 Set-Content 保存它,这是一种保存任何内容列表的好方法。

  • Powershell 的强大和简洁一直让我惊叹不已。对于某些人来说,创建 $fileBaseNames 的行可能有点粗糙,但是将 foreach-object 构造转换为易于准备的多行 foreach 子句将是一件很容易的事情。

    关于PowerShell 脚本仅导出没有文件扩展名的文件名列表,然后输出到每个目录单独的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24284267/

    相关文章:

    powershell - Powershell属性计数

    powershell - 捕获工作流中的错误

    PowerShell 在紧密循环中屈服于操作系统

    arrays - 在 PowerShell 中将数组追加到数组数组

    powershell - Enter-PSSession不适用于端口5986

    excel - 使用 Excel 的 Powershell 脚本运行缓慢

    powershell - 如何在 PowerShell 二进制模块中捕获外部 DLL 的控制台输出?

    用于获取 TFS 集合/项目列表的 PowerShell 脚本

    powershell - GetDate 为负 30 分钟并以 UTC 格式显示

    shell - 如何使用具有多个文件名的 shell 脚本执行 VSTest.Console.exe