首页 文章

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

提问于
浏览
5

我需要一个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 回答

  • 14

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

相关问题