File 将字符串中的特定位置输出到变量

File 将字符串中的特定位置输出到变量,file,powershell,logging,character,File,Powershell,Logging,Character,我有一个长日志文件,看起来像: 2016-06-09 09:44:33 0 Appname C:\folder\file.ext­ 2016-06-09 09:45:33 0 Appname C:\folder\file.ext 2016-06-09 09:46:33 3010 Appname C:\folder\file.ext 2016-06-09 09:56:33 0 Appname C:\folder\file.ext 2016-06-09 09:57:33 0 Appname C:\f

我有一个长日志文件,看起来像:

2016-06-09 09:44:33 0 Appname C:\folder\file.ext­ 2016-06-09 09:45:33 0 Appname C:\folder\file.ext 2016-06-09 09:46:33 3010 Appname C:\folder\file.ext 2016-06-09 09:56:33 0 Appname C:\folder\file.ext 2016-06-09 09:57:33 0 Appname C:\folder\file.ext 现在,是否有一种方法可以“选择”文件中每行所需的字符,比如21到24个字符,这样我就可以得到如下输出:

0 0 3010 0 0 0 0 3010 0 0
在弹出窗口中?

将日志作为CSV导入为以空格分隔的文件。然后,选择第三列

例如:

# Extract the codes from the file into an array
$codes = Import-Csv -path .\name.log -Header "date","time","code","type","file" -Delimiter " " |
    Select-Object -ExpandProperty code

# Make sure each code is displayed on a newline
$formattedCode = $codes -join [Environment]::NewLine

# Display the codes in a popup
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup($formattedCode,0,"Test",0)
我根据您提供的文件内容样本,使用此代码对此进行了测试

$content = @"
2016-06-09 09:44:33 0 Appname C:\folder\file.ext­
2016-06-09 09:45:33 0 Appname C:\folder\file.ext
2016-06-09 09:46:33 3010 Appname C:\folder\file.ext
2016-06-09 09:56:33 0 Appname C:\folder\file.ext
2016-06-09 09:57:33 0 Appname C:\folder\file.ext
"@
$codes = $content | 
    ConvertFrom-Csv -Header "date","time","code","type","file" -Delimiter " " | 
    Select-Object -ExpandProperty code

$formattedCode = $codes -join [Environment]::NewLine

$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup($formattedCode,0,"Test",0)

可以在空格处拆分线,如下所示:

Get-Content 'C:\path\to\your.log' | ForEach-Object {
  $date, $time, $code, $app, $file = $_ -split ' ', 5
  New-Object -Type PSObject -Property @{
    Timestamp   = [datetime]"$date $time"
    Code        = [int]$code
    Application = $app
    File        = Get-Item $file
  }
}
$re = '(?<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?<code>\d+) ' +
      '(?<app>\w+) (?<file>.*)'

Select-String 'C:\path\to\your.log' -Pattern $re |
  Select-Object -Expand Matches |
  ForEach-Object {
    New-Object -Type PSObject -Property @{
      Timestamp   = [datetime]$_.Groups['timestamp'].Value
      Code        = [int]$_.Groups['code'].Value
      Application = $_.Groups['app'].Value
      File        = Get-Item $_.Groups['file'].Value
    }
  }
或者使用正则表达式解析行,如下所示:

Get-Content 'C:\path\to\your.log' | ForEach-Object {
  $date, $time, $code, $app, $file = $_ -split ' ', 5
  New-Object -Type PSObject -Property @{
    Timestamp   = [datetime]"$date $time"
    Code        = [int]$code
    Application = $app
    File        = Get-Item $file
  }
}
$re = '(?<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?<code>\d+) ' +
      '(?<app>\w+) (?<file>.*)'

Select-String 'C:\path\to\your.log' -Pattern $re |
  Select-Object -Expand Matches |
  ForEach-Object {
    New-Object -Type PSObject -Property @{
      Timestamp   = [datetime]$_.Groups['timestamp'].Value
      Code        = [int]$_.Groups['code'].Value
      Application = $_.Groups['app'].Value
      File        = Get-Item $_.Groups['file'].Value
    }
  }
$re='(?\d{4}-\d{2}-\d{2}:\d{2}:\d{2})(?
\d+)+
“(?\w+(.*)”
选择字符串'C:\path\to\your.log'-Pattern$re|
选择对象-展开匹配项|
ForEach对象{
新对象-类型PSObject-属性@{
时间戳=[datetime]$\组['Timestamp'].值
代码=[int]$\组['Code'].值
应用程序=$\组['app'].Value
File=Get Item$\.Groups['File'].Value
}
}
当然,从解析的值创建对象是可选的,但是如果需要进一步处理数据,它可能会派上用场。

短代码:

$wshell = New-Object -ComObject WScript.Shell
$wshell.Popup((import-csv "c:\temp\log.txt" -Header DateLog, TimeLOg, Code -Delimiter ' ').Code -join "`n", 0, "Test", 0)
如果需要,请仅选择不同的0:

$code=(import-csv "c:\temp\log.txt" -Header DateLog, TimeLOg, Code -Delimiter ' ' |where code -ne "0").Code -join "`n"
$wshell = New-Object -ComObject WScript.Shell
$wshell.Popup($code, 0, "Test", 0)

这听起来很完美,很聪明,但不起作用?我创建了一个name.log文件来匹配您的代码,这样我就可以在不改变任何内容的情况下测试它,它返回:Import Csv:找不到与参数名称“file”匹配的参数。在C:\Users\Raphael\Desktop\test.ps1:3 char:21+$codes=Import Csv-file file.log-Header“日期”、“时间”、“代码”、“文件…”+~~~~~~~~~~+CategoryInfo:InvalidArgument:(:)[Import Csv],ParameterBindingException+FullyQualifiedErrorId:NamedParameterNotFound,Microsoft.PowerShell.Commands.ImportCsvCommandIt运行正常,但返回空的格式化代码不包含任何内容准确地说,它返回5行空消息。您的文件与提供的示例内容不同。添加一个带有您提供的帐篷。最后的代码是:$code=Import Csv-path c:\temp\name.log-Header“date”、“time”、“code”、“file”-Delimiter”“| select-ExpandProperty code$formattedCode=$code-join[Environment]::新行$wshell=New对象-ComObject Wscript.Shell$wshell.Popup($formattedCode,0,“Test”,0)非常感谢您的宝贵帮助,学会了一个非常好的窍门谢谢:)祝您有一个愉快的一天非常感谢(与0不同的是,它能创造奇迹,代码很短!非常感谢。没有足够的声誉,我几天前才加入。现在加入了:)感谢当我在powershell中尝试时,该代码不起作用,它只是显示了文件的每一行,带有时间戳、代码和名称,如:2016-12-07 13:37:11 0 VMware无论如何,谢谢然后你做错了什么,因为当我使用包含问题样本数据的文件。不过,如果不进行修改,两个代码样本将以表格形式输出输入文件中解析的字段。