Powershell 选择格式已损坏

Powershell 选择格式已损坏,powershell,Powershell,我有一个PowerShell脚本,它从Bitvise日志中提取帐户、时间和路径 gcc:\temp\all.log| 选择字符串-模式' 它工作正常,但当我运行选择格式时,它就坏了 请记住,使用正则表达式解析XML绝对不是一个好主意(针对Powershell 2及更高版本更新了): Powershell 2: PS D:\PShell> D:\PShell\SO\54476444.ps1 path Account time

我有一个PowerShell脚本,它从Bitvise日志中提取帐户、时间和路径

gcc:\temp\all.log|
选择字符串-模式'
它工作正常,但当我运行选择格式时,它就坏了


请记住,使用正则表达式解析
XML
绝对不是一个好主意(针对Powershell 2及更高版本更新了):

Powershell 2

PS D:\PShell> D:\PShell\SO\54476444.ps1

path        Account time                            
----        ------- ----                            
C:\lyyyy\ff CMU     2019-01-30 11:00:01.903062 -0500
C:\path\ttx yyyyyy  2019-01-30 11:00:01.960986 -0500
==> powershell -version 2 -noprofile -file D:\PShell\SO\54476444.ps1

path                          Account                      time
----                          -------                      ----
C:\lyyyy\ff                   CMU                          2019-01-30 11:00:01.90306...
C:\path\ttx                   yyyyyy                       2019-01-30 11:00:01.96098...

请记住,使用正则表达式解析
XML
绝对不是一个好主意(对于Powershell 2及更高版本更新了):

Powershell 2

PS D:\PShell> D:\PShell\SO\54476444.ps1

path        Account time                            
----        ------- ----                            
C:\lyyyy\ff CMU     2019-01-30 11:00:01.903062 -0500
C:\path\ttx yyyyyy  2019-01-30 11:00:01.960986 -0500
==> powershell -version 2 -noprofile -file D:\PShell\SO\54476444.ps1

path                          Account                      time
----                          -------                      ----
C:\lyyyy\ff                   CMU                          2019-01-30 11:00:01.90306...
C:\path\ttx                   yyyyyy                       2019-01-30 11:00:01.96098...

一旦按照注释修复了XML,您就可以很容易地获得属性值,方法如下:

# you would use Get-Content for this
$log = [xml]@"
<root>
 <event seq="993107" time="2019-01-30 11:00:01.903062 -0500" app="BvSshServer 7.45" name="I_SFS_LIST_DIRECTORY" desc="Virtual filesystem: list directory.">
   <session id="96172" service="SSH" remoteAddress="128.2.27.11:49312" virtualAccount="CMU" windowsAccount="SERVER\BvSsh_VirtualUsers"/>
   <channel type="session" id="1"/>
   <sfs moduleName="FlowSfsWin" mountPath="/" code="91000" desc="Listing directory ended.">
     <parameters path="C:\lyyyy\ff" timeMs="156" entriesCount="23"/>
   </sfs>
 </event>

 <event seq="993108" time="2019-01-30 11:00:01.960986 -0500" app="BvSshServer 7.45" name="xxxx" desc="Virtual filesystem: transfer file.">
   <session id="96172" service="SSH" remoteAddress="0.090.0" virtualAccount="yyyyyy" windowsAccount="server\BvSsh_VirtualUsers"/>
   <channel type="session" id="1"/>
   <sfs moduleName="FlowSfsWin" mountPath="/" code="90000" desc="Transferring file ended.">
     <parameters path="C:\path\ttx" timeMs="109" bytesRead="0" bytesWritten="1772" readRangeOffset="0" readRangeLength="0" writeRangeOffset="0" writeRangeLength="1772" createdNewFile="false" resizedFile="true" endedBy="Client"/>
     <help message="File transfer ended by client."/>
   </sfs>
 </event>
</root>
"@

foreach ($node in $log.DocumentElement.ChildNodes) {
    [pscustomobject]@{
        'Path' = $node.sfs.parameters.path
        'Account' = $node.session.virtualAccount
        'Time' = $node.time
    }
}
还是这个

foreach ($node in $log.DocumentElement.ChildNodes) {
    "" | Select-Object @{name = 'Path'; expression = {$node.sfs.parameters.path}},
                       @{name = 'Account'; expression = {$node.session.virtualAccount}},
                       @{name = 'Time'; expression = {$node.time}}
}
foreach ($node in $log.DocumentElement.ChildNodes) {
    $node | Select-Object @{name = 'Path'; expression = {$_.sfs.parameters.path}},
                          @{name = 'Account'; expression = {$_.session.virtualAccount}},
                          @{name = 'Time'; expression = {$_.time}}
}
结果将是:


一旦按照注释修复了XML,您就可以很容易地获得属性值,方法如下:

# you would use Get-Content for this
$log = [xml]@"
<root>
 <event seq="993107" time="2019-01-30 11:00:01.903062 -0500" app="BvSshServer 7.45" name="I_SFS_LIST_DIRECTORY" desc="Virtual filesystem: list directory.">
   <session id="96172" service="SSH" remoteAddress="128.2.27.11:49312" virtualAccount="CMU" windowsAccount="SERVER\BvSsh_VirtualUsers"/>
   <channel type="session" id="1"/>
   <sfs moduleName="FlowSfsWin" mountPath="/" code="91000" desc="Listing directory ended.">
     <parameters path="C:\lyyyy\ff" timeMs="156" entriesCount="23"/>
   </sfs>
 </event>

 <event seq="993108" time="2019-01-30 11:00:01.960986 -0500" app="BvSshServer 7.45" name="xxxx" desc="Virtual filesystem: transfer file.">
   <session id="96172" service="SSH" remoteAddress="0.090.0" virtualAccount="yyyyyy" windowsAccount="server\BvSsh_VirtualUsers"/>
   <channel type="session" id="1"/>
   <sfs moduleName="FlowSfsWin" mountPath="/" code="90000" desc="Transferring file ended.">
     <parameters path="C:\path\ttx" timeMs="109" bytesRead="0" bytesWritten="1772" readRangeOffset="0" readRangeLength="0" writeRangeOffset="0" writeRangeLength="1772" createdNewFile="false" resizedFile="true" endedBy="Client"/>
     <help message="File transfer ended by client."/>
   </sfs>
 </event>
</root>
"@

foreach ($node in $log.DocumentElement.ChildNodes) {
    [pscustomobject]@{
        'Path' = $node.sfs.parameters.path
        'Account' = $node.session.virtualAccount
        'Time' = $node.time
    }
}
还是这个

foreach ($node in $log.DocumentElement.ChildNodes) {
    "" | Select-Object @{name = 'Path'; expression = {$node.sfs.parameters.path}},
                       @{name = 'Account'; expression = {$node.session.virtualAccount}},
                       @{name = 'Time'; expression = {$node.time}}
}
foreach ($node in $log.DocumentElement.ChildNodes) {
    $node | Select-Object @{name = 'Path'; expression = {$_.sfs.parameters.path}},
                          @{name = 'Account'; expression = {$_.session.virtualAccount}},
                          @{name = 'Time'; expression = {$_.time}}
}
结果将是:



这看起来像XML,但您错过了
virtualAccount=CMU“
上的结尾
,也错过了开头的双引号
。这些是打字错误吗?不,它们是.log格式的bitvise日志,而不是Typo I Sanitizen如果您进行了太多的清理,因为上面说,
bitvise SSH服务器的文本日志文件是以机器可处理的XML格式记录的。
您的XML目前无效。还有,它没有根元素吗?一点也没有,我只是更改了名称。。话虽如此,
Select String
逐行处理输入,这意味着不是格式被破坏,而是您对
Select String
如何工作的期望。这看起来像XML,但您错过了
virtualAccount=CMU
上的结尾
,也错过了开头的双引号
。这些是打字错误吗?不,它们是.log格式的bitvise日志,而不是Typo I Sanitizen如果您进行了太多的清理,因为上面说,
bitvise SSH服务器的文本日志文件是以机器可处理的XML格式记录的。
您的XML目前无效。还有,它没有根元素吗?一点也没有,我只是更改了名称。。话虽如此,
Select String
逐行处理输入,这意味着不是格式被破坏,而是您对
Select String
如何工作的期望。它不起作用,让我检查一下Powershell 3及更高版本,无论如何,谢谢,日志在.log中format@Jondrew已更新Powershell 2(及以上版本)的答案当我尝试从Powershell
路径帐户时间C:\lyyyy\ff CMU 2019-01-30 11:00:01.903062-0500 C:\path\ttxYYYYYY2019-01-30 11:00:01.960986-0500这是正确的格式,但当我使用“获取内容”时,其中断日期位于路径下,而帐户位于路径下time@Jondrew我不明白。即使改为
$log=$logFile.Split([System.Environment]::NewLine)
I运行
$logFile | Out File-FilePath'C:\temp\all.log'-编码默认值,脚本也能工作$log=获取内容-路径“C:\temp\all.log”
。因此,您的文件中一定有什么地方出错了。例如,您最初发布的示例中未经调整的
virtualAccount=CMU“
(而不是
virtualAccount=“CMU”
)导致描述的行为。忘记将正则表达式应用于
XML
数据。正确解析日志;请参阅中的后一种方法。它不起作用,让我检查Powershell 3及更高版本,无论如何,谢谢,日志位于.log中format@Jondrew已更新Powershell 2(及以上版本)的答案当我尝试从Powershell
路径帐户时间C:\lyyyy\ff CMU 2019-01-30 11:00:01.903062-0500 C:\path\ttxYYYYYY2019-01-30 11:00:01.960986-0500这是正确的格式,但当我使用“获取内容”时,其中断日期位于路径下,而帐户位于路径下time@Jondrew我不明白。即使改为
$log=$logFile.Split([System.Environment]::NewLine),脚本也能工作
我运行
$logFile | Out File-FilePath'C:\temp\all.log'-编码默认;$log=Get Content-Path'C:\temp\all.log'
。因此,您的文件中一定有什么地方出错了。例如,您最初发布的示例中未经调整的
virtualAccount=CMU“
(而不是
virtualAccount=“CMU”
)导致描述的行为。忘记将正则表达式应用于
XML
数据。正确解析日志;请参阅中的后一种方法。它不起作用,让我检查一下Powershell 3及更高版本,无论如何,谢谢,日志在.log中format@Jondrew啊,你没有给这台Powershell 2贴标签<代码>[PSCustomObject]
需要版本3或更高版本。没有问题服务器有PS 5我在工作周如果我要检查它是否工作,请让我检查Powershell 3及更高版本,无论如何,谢谢,日志都在。logformat@Jondrew啊,你没有给这台Powershell 2贴标签<代码>[PSCustomObject]
需要版本3或更高版本。没有问题服务器有PS 5我在工作周如果我会检查