Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用powershell从文件名写入部分,包括合并的txt/csv文件中的第一行_Powershell_Csv_Merge_Filenames - Fatal编程技术网

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

使用powershell从文件名写入部分,包括合并的txt/csv文件中的第一行,powershell,csv,merge,filenames,Powershell,Csv,Merge,Filenames,我目前正在编写一个PowerShell脚本,它可以读取多个工作站上的默认打印机,并将信息写入文本文件到网络驱动器。关于脚本中一些文本替换的最后一个问题已成功解决。但现在我在做第二部分 Get-WmiObject -Class Win32_Printer -Filter "Default = $true" | % { $_.Name -replace '(?:.*)\\NDPS-([^\.]+)(?:.*)', 'PS-$1' } | Out-File -FilePath "H:\daten\

我目前正在编写一个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中的数据。有人能告诉我如何将文件名中的部分插入合并文件吗?

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

$_.Name -match '^.*?_(.*)_.*?\.txt$'
$username = $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
}
正则表达式中的组(可通过
$matches[1]
访问)包含文件名中第一个下划线和最后一个下划线之间的文本

您可以这样使用它:

$_.Name -match '^.*?_(.*)_.*?\.txt$'
$username = $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

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

您好,Ansgar Wiechers,感谢您提供的解决方案。但是我不知道如何在我第一个问题的第二个代码中使用您的建议。如果我在上面代码的末尾添加它,我将收到零数组索引错误。非常感谢!它工作得很好!向您致意,代理Pagus感谢您提供更多的csv解决方案。我完全是powershell的新手,但我从这个董事会的专业人士那里学到了越来越多的东西。