【问题标题】:Output multiple .csv files appending the .csv file name as the source folder name with powershell输出多个 .csv 文件,将 .csv 文件名附加为带有 powershell 的源文件夹名称
【发布时间】:2021-12-14 00:24:18
【问题描述】:

我有 30 个文件夹。每个文件夹包含 22 个 .text 文件。我正在尝试获取每个 .text 文件的文件名和行数并将其输出到 .csv 文件中,并将 .csv 文件的名称附加到每个子文件夹的名称中。

我制作的脚本有效,但它会从所有子文件夹中提取所有 .text 文件并将其输出到单个 .csv 文件中。

知道如何为每个子文件夹创建一个 .csv 文件吗?


$results = Get-ChildItem "C:\Users\testserver\Documents\logfiles\*.txt" -Recurse | % { $_ | select name, @{n="lines";e={get-content $_ | measure-object -line | select -expa lines } } } | Select-Object name, lines

$results | Export-Csv "C:\Users\testserver\Documents\results.csv" -notype

【问题讨论】:

    标签: windows powershell server scripting


    【解决方案1】:

    使用Group-Object cmdlet 处理按文件所在目录分组的文件:

    $inDir = 'C:\Users\testserver\Documents\logfiles'
    $outDir = 'C:\Users\testserver\Documents'
    
    Get-ChildItem -File -Recurse -Filter *.txt $inDir |
      Group-Object DirectoryName | 
        ForEach-Object {
          $outFile = Join-Path $outDir "results-$(Split-Path -Leaf $_.Name).csv"
          $_.Group |
            Select-Object Name, @{ n="Lines"; e={ (Get-Content $_.FullName | Measure-Object -Line).lines } } |
              Export-Csv -NoTypeInformation $outFile
        }
    

    上面会在$outDir 中创建诸如results-foo.csv 之类的输出文件,其中foo 是包含*.txt 文件的子目录的名称。

    注意,假设目标$inDir目录树中没有两个子目录具有相同的名称;如果您需要处理此类冲突,则需要做更多工作,例如在文件名中反映 相对路径,并将 \ 替换为替代字符。

    【讨论】:

    • 非常感谢。从未想过使用 Group-Object !
    • 很高兴听到这个消息,@TitanL0rd。虽然它不是速度恶魔,但Group-Object 在许多情况下都能派上用场。
    猜你喜欢
    • 2018-11-18
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    相关资源
    最近更新 更多