Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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
使用Windows cmd或Powershell将多行文本日志转换为CSV_Windows_Powershell_Cmd - Fatal编程技术网

使用Windows cmd或Powershell将多行文本日志转换为CSV

使用Windows cmd或Powershell将多行文本日志转换为CSV,windows,powershell,cmd,Windows,Powershell,Cmd,我正在尝试将一个统一的多行日志文件转换为CSV,但没有任何效果。请帮忙!我在Windows服务器上,所以它必须是命令行或Powershell 输入样本: SERVICE_NAME: BDESVC DISPLAY_NAME: BitLocker Drive Encryption Service BDESVC hosts the BitLocker Drive Encryption service. BitLocker Drive Encryption provides secure startup

我正在尝试将一个统一的多行日志文件转换为CSV,但没有任何效果。请帮忙!我在Windows服务器上,所以它必须是命令行或Powershell

输入样本:

SERVICE_NAME: BDESVC
DISPLAY_NAME: BitLocker Drive Encryption Service
BDESVC hosts the BitLocker Drive Encryption service. BitLocker Drive Encryption provides secure startup for the operating system, as well as full volume encryption for OS, fixed or removable volumes. This service allows BitLocker to prompt users for various actions related to their volumes when mounted, and unlocks volumes automatically without user interaction. Additionally, it stores recovery information to Active Directory, if available, and, if necessary, ensures the most recent recovery certificates are used.  Stopping or disabling the service would prevent users from leveraging this functionality.
    TYPE          : 20 WIN32_SHARE_PROCESS 
    START_TYPE    : 3  DEMAND_START
    ERROR_CONTROL     : 1  NORMAL
    BINARY_PATH_NAME  : C:\WINDOWS\System32\svchost.exe -k netsvcs
    LOAD_ORDER_GROUP  : 
    TAG       : 0
    DEPENDENCIES      : 
    SERVICE_START_NAME: localSystem
    FAIL_RESET_PERIOD : 900 seconds
    FAILURE_ACTIONS   : Restart DELAY: 60000 seconds
              : Restart DELAY: 60000 seconds
              : None    DELAY: 0 seconds

SERVICE_NAME: BFE
DISPLAY_NAME: Base Filtering Engine
The Base Filtering Engine (BFE) is a service that manages firewall and Internet Protocol security (IPsec) policies and implements user mode filtering. Stopping or disabling the BFE service will significantly reduce the security of the system. It will also result in unpredictable behavior in IPsec management and firewall applications.
    TYPE          : 20 WIN32_SHARE_PROCESS 
    START_TYPE    : 2  AUTO_START
    ERROR_CONTROL     : 1  NORMAL
    BINARY_PATH_NAME  : C:\WINDOWS\system32\svchost.exe -k LocalServiceNoNetwork
    LOAD_ORDER_GROUP  : NetworkProvider
    TAG       : 0
    DEPENDENCIES      : RpcSs
    SERVICE_START_NAME: NT AUTHORITY\LocalService
    FAIL_RESET_PERIOD : 86400 seconds
    FAILURE_ACTIONS   : Restart DELAY: 120000 seconds
              : Restart DELAY: 300000 seconds
              : None    DELAY: 0 seconds
需要CSV输出(仅显示第一个事件):


这里有一个可能的解决方案。请记住,这会对您的数据做出一些假设,而做这种事情总是有点不切实际:

(Get-Content 'YourFile.log') -Replace '(.*?)\s*:\s*(.*)','$1=$2' -Split '\r\n\r\n' | ForEach-Object { 
    $Text = ($_ -split '\n') -Replace '\\','\\'
    $Text[2] = 'DESCRIPTION='+ $Text[2]
    $Result = $Text | Out-String | ConvertFrom-StringData
    $Properties = [ordered]@{}

    $Headers = 'SERVICE_NAME','DISPLAY_NAME','DESCRIPTION','TYPE','START_TYPE','ERROR_CONTROL','BINARY_PATH_NAME','LOAD_ORDER_GROUP','TAG','DEPENDENCIES','SERVICE_START_NAME','FAIL_RESET_PERIOD','FAILURE_ACTIONS'
    $Headers | ForEach-Object { $Properties.Add($_,$Result.$_) }
    [PSCustomObject]$Properties

} | Export-CSV 'out.csv' -NoTypeInformation
  • 使用正则表达式
    (.*)\s*:\s*(.*)
    将第一个
    及其两侧的任何空格字符转换为
    =
    。我们这样做是为了以后可以使用
    ConvertFrom-StringData
    cmdlet将数据转换为哈希表对象
  • 根据有两个(Windows样式)回车的位置拆分数据
    \r\n\r\n
    ,因此我们有一个单独记录的集合
  • 遍历记录并将文本拆分为单独的行。使用(看起来很混乱的)正则表达式“\\\”、“\\\”将任何单个斜杠替换为两个斜杠。这是为了
    convertfromstringdata
    不会被文件路径绊倒
  • 获取数据中的第三行,并将“DESCRIPTION=”添加到此行的开头,否则此行不是预期的name=value格式
  • 通过
    Out string
    将结果文本返回到单个字符串对象,然后通过
    ConvertFrom StringData
    将其转换为哈希表
  • 由于
    ConvertFrom-StringData
    按字母顺序重新排列字段,因此创建第二个名为
    [ordered]
    的哈希表,该哈希表使用预定义的标题有序列表,然后从此列表创建PowerShell对象
  • 将结果导出为CSV

    • 这里有一个可能的解决方案。请记住,这会对您的数据做出一些假设,而做这种事情总是有点不切实际:

      (Get-Content 'YourFile.log') -Replace '(.*?)\s*:\s*(.*)','$1=$2' -Split '\r\n\r\n' | ForEach-Object { 
          $Text = ($_ -split '\n') -Replace '\\','\\'
          $Text[2] = 'DESCRIPTION='+ $Text[2]
          $Result = $Text | Out-String | ConvertFrom-StringData
          $Properties = [ordered]@{}
      
          $Headers = 'SERVICE_NAME','DISPLAY_NAME','DESCRIPTION','TYPE','START_TYPE','ERROR_CONTROL','BINARY_PATH_NAME','LOAD_ORDER_GROUP','TAG','DEPENDENCIES','SERVICE_START_NAME','FAIL_RESET_PERIOD','FAILURE_ACTIONS'
          $Headers | ForEach-Object { $Properties.Add($_,$Result.$_) }
          [PSCustomObject]$Properties
      
      } | Export-CSV 'out.csv' -NoTypeInformation
      
      • 使用正则表达式
        (.*)\s*:\s*(.*)
        将第一个
        及其两侧的任何空格字符转换为
        =
        。我们这样做是为了以后可以使用
        ConvertFrom-StringData
        cmdlet将数据转换为哈希表对象
      • 根据有两个(Windows样式)回车的位置拆分数据
        \r\n\r\n
        ,因此我们有一个单独记录的集合
      • 遍历记录并将文本拆分为单独的行。使用(看起来很混乱的)正则表达式“\\\”、“\\\”将任何单个斜杠替换为两个斜杠。这是为了
        convertfromstringdata
        不会被文件路径绊倒
      • 获取数据中的第三行,并将“DESCRIPTION=”添加到此行的开头,否则此行不是预期的name=value格式
      • 通过
        Out string
        将结果文本返回到单个字符串对象,然后通过
        ConvertFrom StringData
        将其转换为哈希表
      • 由于
        ConvertFrom-StringData
        按字母顺序重新排列字段,因此创建第二个名为
        [ordered]
        的哈希表,该哈希表使用预定义的标题有序列表,然后从此列表创建PowerShell对象
      • 将结果导出为CSV

      要提供与之不同的视角,您可以尝试使用
      Select String
      捕获需要输出的变量,而不是完全按照这两种特定情况的格式进行处理

      您可以尝试以下方法:

      $myArr = [IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=SERVICE_NAME)" -AllMatches | % {$_.Matches} | % {$_.Value}
      
      这将返回所有单个日志条目的数组,前提是
      SERVICE\u NAME
      从每个条目开始。从那里,您可以循环该数组中的每个条目,并查找要输出到CSV的值:

      $myArr = @()
      [IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=(SERVICE_NAME)|($))" -AllMatches | % {$_.Matches} | % {$_.Value} | % { $myArr += `
          [PSCustomObject]@{
              "Type" = Select-String -InputObject $_ -Pattern "(?<=TYPE          : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
              "START_TYPE" = Select-String -InputObject $_ -Pattern "(?<=START_TYPE    : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
          }}
      
      或者,如果您不想将其读入变量,请将其添加到管道末端:

      [IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=(SERVICE_NAME)|($))" -AllMatches | % {$_.Matches} | % {$_.Value} | % { `
          @([PSCustomObject]@{
              "Type" = Select-String -InputObject $_ -Pattern "(?<=TYPE          : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
              "START_TYPE" = Select-String -InputObject $_ -Pattern "(?<=START_TYPE    : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
          })} | Select-Object -Property Type,Start_Type | Export-Csv -Path C:\temp\test\myout.txt -NoTypeInformation
      
      [IO.File]::ReadAllText(“C:\YourLogFile.txt”)|选择字符串模式“服务名称[\s\s]*?(?=(服务名称)|($)”)“-AllMatches |%{$|.Matches}{$|.Value}}{`
      @([PSCustomObject]@{
      
      “Type”=Select String-InputObject$_uu2;Pattern”(?要提供与之不同的视角,您可以尝试使用
      Select String
      捕获需要输出的变量,而不是像这两种特定情况那样使用格式

      您可以尝试以下方法:

      $myArr = [IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=SERVICE_NAME)" -AllMatches | % {$_.Matches} | % {$_.Value}
      
      这将返回一个包含所有单个日志条目的数组,假设
      服务\u NAME
      从每个条目开始。从那里,您可以循环该数组中的每个条目,并查找要输出到CSV的值:

      $myArr = @()
      [IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=(SERVICE_NAME)|($))" -AllMatches | % {$_.Matches} | % {$_.Value} | % { $myArr += `
          [PSCustomObject]@{
              "Type" = Select-String -InputObject $_ -Pattern "(?<=TYPE          : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
              "START_TYPE" = Select-String -InputObject $_ -Pattern "(?<=START_TYPE    : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
          }}
      
      或者,如果您不想将其读入变量,请将其添加到管道末端:

      [IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=(SERVICE_NAME)|($))" -AllMatches | % {$_.Matches} | % {$_.Value} | % { `
          @([PSCustomObject]@{
              "Type" = Select-String -InputObject $_ -Pattern "(?<=TYPE          : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
              "START_TYPE" = Select-String -InputObject $_ -Pattern "(?<=START_TYPE    : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
          })} | Select-Object -Property Type,Start_Type | Export-Csv -Path C:\temp\test\myout.txt -NoTypeInformation
      
      [IO.File]::ReadAllText(“C:\YourLogFile.txt”)|选择字符串模式“服务名称[\s\s]*?(?=(服务名称)|($)”)“-AllMatches |%{$|.Matches}{$|.Value}}{`
      @([PSCustomObject]@{
      
      “Type”=选择字符串-InputObject$\模式”(?欢迎使用SO!虽然有很多SO用户可以为您编写脚本,但SO不是一个代码编写服务,而是一个问答论坛。您应该尝试一下,发布代码,并就哪些内容不起作用提出具体问题。^^这是非常正确的,值得以后记住。我已经回答了,但主要是因为这些问题allenges总是激起我的好奇心。希望它能帮助我。欢迎来到SO!虽然有很多SO用户可以为你编写脚本,但SO不是一个代码编写服务,而是一个问答论坛。你应该尝试一下,发布你的代码,并问一些关于哪些不起作用的具体问题。^^这是非常正确的,值得以后记住。我我已经回答了,但主要是因为这些挑战总是激发我的好奇心。希望能有所帮助。我一直在尝试一些脚本,但都失败了。我会确保在下次我问一些事情时发布它们。谢谢!哇,真是太棒了