2013-03-12 174 views
0

我目前正在研究PowerShell脚本,该脚本读出多个工作站上的默认打印机,并将信息写入文本文件到网络驱动器。我最后一个关于脚本内部文本替换的问题已成功解决。但是现在我在第二部分工作。从文件名写入部分,包括合并的txt/csv文件中的第一行与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) -part上线使用数据Excel中。有人可以请我提示如何从合并文件中的文件名插入部分?

回答

0

您可以提取用户名部分从文件名是这样的:

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

中(通过$matches[1] accsisible)的正则表达式组包含第一,并在文件名的最后一个下划线的文本。

你可以使用这样的:

$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 

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

+0

你好Ansgar Wiechers,谢谢你提供的解决方案。但我不确定如何在第一个问题的第二个代码中使用您的建议。如果我在上面的代码的末尾添加它,我会收到零阵列索引错误。 – 2013-03-12 12:29:17

+0

@AgentSpagusi查看更新的答案。 – 2013-03-12 12:59:59

+0

非常感谢!它完美无缺!最好的问候,AgentSpagusi – 2013-03-12 13:08:37

相关问题