从文件名中写入部分,包括合并的txt / csv -file中的第一行和powershell

时间:2013-03-12 10:11:35

标签: powershell csv merge filenames

我目前正在开发PowerShell脚本,该脚本读取多个工作站上的默认打印机,并将文本文件中的信息写入网络驱动器。关于脚本中的一些文本替换的最后一个问题已成功解决。但现在我在第二部分工作。

Get-WmiObject -Class Win32_Printer -Filter "Default = $true" | % {
  $_.Name -replace '(?:.*)\\NDPS-([^\.]+)(?:.*)', 'PS-$1'
} | Out-File -FilePath "H:\daten\printer\$($env:COMPUTERNAME)_defaultprinter.txt"
Get-WmiObject Win32_Printer -Filter "Default = $true" `
  | Select-Object -expandProperty Name `
  | Out-File -FilePath "P:\batch\migration\Printer\$($env:COMPUTERNAME)_$($env:USERNAME)_defaultprinter.txt"

提供的代码的最后一行将默认打印机写入网络驱动器。现在我有近1500个单txt文件。为了更好地分析,我使用以下PowerShell脚本将所有单个txt文件合并到一个大文件中。

Get-ChildItem -path \\samplepath\prgs\prgs\batch\migration\Printer -recurse | ? {
  ! $_.PSIsContainer
} | ? {
  ($_.name).contains(".txt")
} | % {
  Out-File -filepath \\samplepath\prgs\prgs\batch\migration\Printer\gesamt_printer.txt -inputobject (get-content $_.fullname) -Append
}

我收到一个文件,其中包含每个txt文件的默认打印机信息,但我需要$($env:USERNAME) - 文件名中的部分作为单独的值以及在线的打印机信息以使用数据Excel中。有人可以提供一个如何在合并文件中插入文件名的部分吗?

1 个答案:

答案 0 :(得分:0)

您可以从文件名中提取用户名部分,如下所示:

$_.Name -match '^.*?_(.*)_.*?\.txt$'
$username = $matches[1]

正则表达式中的组(可通过$matches[1]执行)包含文件名中第一个和最后一个下划线之间的文本。

您可以像这样使用它:

$root    = "\\samplepath\prgs\prgs\batch\migration\Printer"
$outfile = "$root\gesamt_printer.txt"

Get-ChildItem $root -Recurse | ? {
  -not $_.PSIsContainer -and $_.Extension -eq ".txt"
} | % {
  $_.Name -match '^.*?_(.*)_.*?\.txt$'
  $username = $matches[1]
  $content  = Get-Content $_.FullName
  "{0},{1}" -f ($content, $username) | Out-File $outfile -Append
}

您也可以直接创建CSV:

$root    = "\\samplepath\prgs\prgs\batch\migration\Printer"
$outfile = "$root\gesamt_printer.txt"

$getPrinter = { Get-Content $_.FullName }
$getUser    = { $_.Name -match '^.*?_(.*)_.*?\.txt$' | Out-Null; $matches[1] }

Get-ChildItem $root -Recurse `
  | ? { -not $_.PSIsContainer -and $_.Extension -eq ".txt" } `
  | select @{n="Username";e=$getUser},@{n="Printer";e=$getPrinter} `
  | Export-Csv $outfile -NoTypeInformation

请注意,这些代码示例不包含任何检查,以排除其中至少有两个下划线的文件名。