我目前正在开发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中。有人可以提供一个如何在合并文件中插入文件名的部分吗?
答案 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
请注意,这些代码示例不包含任何检查,以排除其中至少有两个下划线的文件名。