簡體   English   中英

用於從多個文本文件中提取數據到 Excel 電子表格的 Powershell 腳本

[英]Powershell script to extract data from multiple text files into an excel spreadsheet

我對 PS 還很陌生,並且已經掙扎了幾天。 我在一個文件夾中有多個文本文件,其中包含我想提取到 Excel 電子表格中的特定數據。 每個文件看起來像這樣:

Client n° : xxx Client name : xxx

                Computer status

pc group 1 : 

n°1 OK                   n°2 Disconnected               n°3 Unresponsive
n°4 Unreachable host     n°5 Unresponsive

Data read 11/11/20 12:50:07

Version: x.x.x 

我想要一個看起來像這樣的輸出文件:

 Client name and n°     OK       Disconnected      Unresponsive    Unreachable host   version       
     xxx/xxx            1             1                2                 1             x.x.x

對於狀態列,它是具有該狀態的 pc 的總和,而不是我想顯示的 pc n°。

目前我正在使用多個 .bat 文件搜索狀態並為每個狀態輸出一個文件

find /c "Disconnected" *.* > disconnected.txt
find /c "Unresponsive" *.* > unresponsive.txt

然后我在 excel 中對每個輸出進行排序,這花費了我太多時間,我想知道是否可以使用腳本自動執行此任務。

我真的沒有任何 PS 知識,只有基本的批處理命令。

讓我們假設您的文件都在一個文件夾中,並且所有文件都具有.txt擴展名。

然后你需要遍歷這些文件並從中解析你需要的數據:

# create a Hashtable to add the different status values in
$status = @{'OK' = 0; 'Disconnected'= 0; 'Unresponsive' = 0; 'Unreachable host'= 0}

# loop through the files in your path and parse the information out
$result = Get-ChildItem -Path 'D:\Test' -Filter '*.txt' -File | ForEach-Object {
    switch -Regex -File $_.FullName {
        '^Client n°\s*:\s*([^\s]+)\s+Client name\s*:\s*(.+)$' {
            # start collecting data for this client
            $client = '{0}/{1}' -f $matches[2], $matches[1]
            # reset the Hashtable to keep track of the status values
            $status = @{'OK' = 0; 'Disconnected'= 0; 'Unresponsive' = 0; 'Unreachable host'= 0 }
        }
        '^\d+' {
            # increment the various statuses in the Hahstable
            ($_ -split '\d+').Trim() | ForEach-Object { $status[$_]++ }
        }
        '^Version:\s(.+)$' {
            $version = $matches[1]
            # since this is the last line for this client, output the collected data as object
            [PsCustomObject]@{
                'Client name and n°' = $client
                'OK'                 = $status['OK']
                'Disconnected'       = $status['Disconnected']
                'Unresponsive'       = $status['Unresponsive']
                'Unreachable host'   = $status['Unreachable host']
                'Version'            = $version
            }
        }
    }
}

# output on screen
$result | Format-Table -AutoSize

# output to CSV file
$result | Export-Csv -Path 'D:\Test\clientdata.csv' -UseCulture -NoTypeInformation

屏幕上的結果:

Client name and n° OK Disconnected Unresponsive Unreachable host Version
------------------ -- ------------ ------------ ---------------- -------
xxx/xxx             1            1            2                1 x.x.x 

我以此作為練習來測試我的能力。 我用不同的數據創建了三個相同的文件,並測試了這個腳本。

只要它們是目錄中的文本文件,腳本就會遍歷每個文件並按照您所說的從每個文件中提取數據。 如果添加了一個雜散的文本文件,腳本不知道也不關心,並且會像其他人一樣對待它。 如果有它可以找到的數據,它將將該數據輸出到excel文件中。 最后,文件被設置為自我保存,然后立即關閉。

它首先創建 Excel 文件,然后是工作簿。 (我注釋掉了工作簿的命名。如果您願意,可以將其添加回來。)在目錄中查找所有文本文件,然后在您上面指定的文本中搜索特定內容的文本。

在腳本期間,我盡可能多地評論了我認為可能需要的評論,以幫助以后進行修改。

輸出格式如下: Excel 輸出

#Create An Excel File
$excel = New-Object -ComObject excel.application
$excel.visible = $True

#Add Workbook
$workbook = $excel.Workbooks.Add()

<#Rename Workbook
$workbook= $workbook.Worksheets.Item(1)
$workbook.Name = 'Client name and #'#>

#create the column headers
$workbook.Cells.Item(1,1) = 'Client name and n°'
$workbook.Cells.Item(1,2) = 'OK'
$workbook.Cells.Item(1,3) = 'Disconnected'
$workbook.Cells.Item(1,4) = 'Unresponsive'
$workbook.Cells.Item(1,5) = 'Unreachable'
$workbook.Cells.Item(1,6) = 'Version'
$workbook.Cells.Item(1,7) = 'Date Gathered'

$move = "C:\Users\iNet\Desktop\Testing"
$root = "C:\Users\iNet\Desktop\Testing"
$files = Get-ChildItem -Path $root -Filter *.txt

#Starting on Row 2
[int]$i = 2
ForEach ($file in $files){
   
$location = $root+"\"+$file

#Format your client data to output what you want to see. 
$ClientData = select-string -path "$location" -pattern "Client"
$ClientData = $ClientData.line
$ClientData = $ClientData -replace "Client n° :" -replace ""
$ClientData = $ClientData -replace "Client name :" -replace "|"
$row = $i
$Column = 1
$workbook.Cells.Item($row,$column)= "$ClientData"

#Data Read Date
$DataReadDate = select-string -path "$location" -pattern "Data read"
$DataReadDate = $DataReadDate.line
$DataReadDate = $DataReadDate -replace "Data read " -replace ""
    #Data Read Date, you asked for everything but this.
$row = $i
$Column = 7
$workbook.Cells.Item($row,$column)= "$DataReadDate" 

#Version
$Version = select-string -path "$location" -pattern "Version:"
$Version = $Version.line
$Version = $Version -replace "Version: " -replace ""
$row = $i
$Column = 6
$workbook.Cells.Item($row,$column)= "$Version"

#How Many Times Unresponsive Shows Up
$Unresponsive = (Get-Content "$location" | select-string -pattern "Unresponsive").length
$row = $i
$Column = 4
$workbook.Cells.Item($row,$column)= "$Unresponsive"
 
#How Many Times Disconnected Shows Up
$Disconnected = (Get-Content "$location" | select-string -pattern "Disconnected").length
$row = $i
$Column = 3
$workbook.Cells.Item($row,$column)= "$Disconnected"

#How Many Times Unreachable host Shows Up
$Unreachable = (Get-Content "$location" | select-string -pattern "Unreachable host").length
$row = $i
$Column = 5
$workbook.Cells.Item($row,$column)= "$Unreachable"

#How Many Times OK Shows Up
$OK = (Get-Content "$location" | select-string -pattern "OK").length
$row = $i
$Column = 2
$workbook.Cells.Item($row,$column)= "$OK"
#Iterate by one so each text file goes to its own line.
$i++
}

#Save Document
$output = "\Output.xlsx"
$FinalOutput = $move+$output
#saving & closing the file
$workbook.SaveAs($move)
$excel.Quit()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM