我是Powershell的新手,我正在尝试制作一个脚本,以便提取一些数据,然后启动一个命令。 这是交易: 我有一个应用程序,有时会出错(我必须查看日志文件)与特定的错误代码(总是相同),并在同一行我有一个“ID”,IDT。
所以我的问题是: 我必须每隔5分钟查看一次这个日志文件,然后搜索错误代码 CFTT82E ,并在此行中获取我的IDT值,这是数字,这里看起来像这样的行: / p>
14/01/15 12:20:06 CFTT82E transfer aborted IDTU=A0009L7Q PART=DGISSL IDF=LKEMDDIB IDT=A1512489 730 ABO 215>
一旦我得到变量中的值,我必须等待5分钟,然后使用我的IDT的值启动命令,也就是说:
cmd -toto $IDT_value
现在,一旦命令成功(我只需要与 CFTR12I 代码和我的IDT值进行比较),我会得到一条消息:
14/01/15 15:48:39 CFTR12I END Treated for USER Système PART=DGISSL IDF=* IDT=A1512489>
此时,我将退出,否则,我将重新启动相同的命令。
但是,由于这个脚本应该每隔5分钟在Loop中工作,下次我将解析日志文件时,我应该忽略之前已经使用过的IDT。 我想用每日IDT值创建一个数组(在日期结束时我们可以清空数组或变量或该对象将是什么)然后比较每个循环的值。
我已经开始这样了但是因为我是新手,我认为我没有一个好的开始:
clear
Get-Content C:\CFT\LOG2014011523590001 |
foreach {
$line = $_.Trim()
If ($line.Contains('CFTT82E')) {
$str = $line.Split(' ')
$TIDT = [ordered]@{
IDT = $_.SubString(101)
}
New-Object PsObject -Property $TIDT
}
} | Out-String
我知道我问了很多但是,欢迎提出任何建议。
答案 0 :(得分:0)
这可能会对你有所帮助。创建一个ArrayList以查找存储的值,然后查看您的文件。如果IDT不在列表中,请使用IDT执行某些操作,然后将其添加到列表中,以便在后续运行时将其忽略。
$list = New-Object System.Collections.ArrayList
while (1) {
$content = get-content "C:\your\file.txt"
foreach ($line in $content) {
if ($line -match "CFTT82E.*IDT=(.+?)\b.*") {
$idt = $matches[1]
if(!$list.contains($idt) {
#
# Do whatever you need to do with $idt
#
$list.add($idt)
}
}
}
sleep -Seconds(5*60)
}