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

时间:2014-06-18 11:23:59

标签: powershell powershell-v2.0 powershell-v3.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)
}

1 个答案:

答案 0 :(得分:15)

展示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子句是一件很容易的事。