0

私は現在、複数のワークステーションでデフォルトのプリンターを読み取り、その情報をテキストファイルにネットワーク ドライブに書き込む 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 ファイルを 1 つの大きなファイルにマージします。

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でデータを使用するには、オンラインのプリンター情報に加えて、ファイル名の-partを別の値として必要とします。マージされたファイルにファイル名の一部を挿入する方法を教えてください。

4

1 に答える 1

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

これらのコード サンプルには、少なくとも 2 つのアンダースコアを含まないファイル名を除外するためのチェックが含まれていないことに注意してください。

于 2013-03-12T11:33:48.290 に答える