【问题标题】:PowerShell script to export a list of file names only with no file extension then output to a text file separate for each directoryPowerShell脚本仅导出没有文件扩展名的文件名列表,然后输出到每个目录单独的文本文件
【发布时间】:2014-08-08 16:09:30
【问题描述】:

我需要一个 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)
}

【问题讨论】:

  • 本网站不用于“请求脚本”。向我们展示您尝试了什么,失败的地方以及无效的地方。然后,我们可以尝试为您指明正确的方向或查看脚本并提供一些提示。
  • 这是上次的情况,我有个需求,有人给了我一个脚本。好的,稍后我会在电脑前分享脚本。
  • 好吧,如果您查看一些“高质量”问题(例如 stackoverflow.com/questions/11227809/…),这可以让您对本网站的用途有一个很好的了解。
  • 这是我到目前为止所拥有的,但似乎无法解决如何根据不同的文件夹将文件名列出到不同的文本文件。我在上面添加了我的脚本
  • 好的,在这上面花了一些时间,脚本在下面添加到之前的尝试中。这次我似乎非常接近,但是最后写入文本文件不是100%,我之前使用的是Out-File,它在每个文本文件的底部留下了一个我不想要的空白行。为什么我切换到 [system.io.file]::WriteAllText 和 [system.io.file]::AppendAllText,但是它们中的每一个都有其不符合我需要的特质。在文本文件中,我需要一列中没有空行的文件列表。

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


【解决方案1】:

这是展示 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 子句就足够简单了。

【讨论】:

  • 您可以通过$fileBaseNames = (Get-ChildItem $folder\*.mp3).BaseName 直接获取无扩展名的文件名。
  • 或者(gci -File) | % {$_.Name.TrimEnd($_.Extension)}
  • 您好 WiiBopp,感谢您的宝贵意见,但是创建的文本文件末尾仍然有一个空行。我正在尝试创建末尾没有空行的文本文件,因此文本文件将列出所有歌曲,最后一首歌曲是文本文件的绝对最后一行。
猜你喜欢
  • 2019-12-26
  • 2021-12-10
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2017-06-27
  • 2019-06-11
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多