2014-11-14 106 views
0

我正在处理一个脚本,该脚本监视错误文件夹并在发生错误时发送电子邮件。对于每个错误,我们在文件夹中获取两个文件,一个文本文件和一个xml。在电子邮件中,我想包括文本文件的全部内容和xml文件的部分内容。Powershell变量获取“丢失”

在以下脚本中,我只获取文本文件的内容。 (用于发送电子邮件的行被注释掉以用于测试目的)。我已阅读有关变量和foreach,我想这可能是问题,但我仍然不知道如何解决这个问题在我的脚本。或者也许有更简单的方法来做到这一点?

$Foldertowatch = 'C:\lpos\invalidArts' 
$FilterXML = '*.xml' 
$FilterTXT = '*.txt' 

Unregister-Event -SourceIdentifier CreatedEventXML 
$fswXML = New-Object System.IO.FileSystemWatcher $Foldertowatch, $FilterXML 
$fswXML.EnableRaisingEvents=$true 
$fswXML.IncludeSubdirectories=$false 

Register-ObjectEvent -InputObject $fswXML -EventName Created -SourceIdentifier CreatedEventXML -Action { 
$Filename = $Event.SourceEventArgs.Name 
[XML]$XMLFile = (Get-Content $Foldertowatch\$Filename) 
$XMLtmp = foreach ($user in $XMLFile.POSLog.POSLogTransaction) 
{ 
$user.RetailStoreID 
$user.WorkStationID 
$user.OperatorID 
$user.SequenceNumber 
} 
} 

Unregister-Event -SourceIdentifier CreatedEventTXT 
$fswTXT = New-Object System.IO.FileSystemWatcher $Foldertowatch, $FilterTXT 
$fswTXT.EnableRaisingEvents=$true 
$fswTXT.IncludeSubdirectories=$false 

Register-ObjectEvent -InputObject $fswTXT -EventName Created -SourceIdentifier CreatedEventTXT -Action { 
$FilenameTXT = $Event.SourceEventArgs.Name 
$ContentTXT = (Get-Content $Foldertowatch\$FilenameTXT) -join "`n" 

write-host $user.retailstoreid 
Write-Host $contenttxt 

<#$From = "[email protected]" 
$To = "[email protected]" 
$SMTPServer = "mailserver.com" 
$subject = $env:COMPUTERNAME + " contains invalid ARTSXML"#> 
<#Write-Host "Store:" + $ContentXML.RetailStoreID + "`n" + "Workstation:" + $ContentXML.WorkStationID + "`n" +"Operator:" + $ContentXML.OperatorID + "`n" +"Receiptnumber:" + $ContentXML.sequencenumber + "`n" + "`n" + "Filelocation: $Foldertowatch\$FilenameTXT" + "`n" + "`n" + <#$ContentTXT##> 
<#$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer); 
$smtp.Send($From, $To, $subject, $body);#> 
} 

$ ContentXML是从早期尝试,现在应该是$ user。 我设法得到XML的内容,如果我像这样运行脚本的第一部分:

$Foldertowatch = 'C:\lpos\invalidArts' <# Folder to watch #> 
$FilterXML = '*.xml' <# Use *.xml #> 
$FilterTXT = '*.txt' <# Use *.txt for poslog2arts, use *.log for POS Reporting #> 

Unregister-Event -SourceIdentifier CreatedEventXML 
$fswXML = New-Object System.IO.FileSystemWatcher $Foldertowatch, $FilterXML 
$fswXML.EnableRaisingEvents=$true 
$fswXML.IncludeSubdirectories=$false 

Register-ObjectEvent -InputObject $fswXML -EventName Created -SourceIdentifier CreatedEventXML -Action { 
$Filename = $Event.SourceEventArgs.Name 
[XML]$XMLFile = (Get-Content $Foldertowatch\$Filename) 
$XMLtmp = foreach ($user in $XMLFile.POSLog.POSLogTransaction) 
{ 
write-host $user.RetailStoreID 
write-host $user.WorkStationID 
write-host $user.OperatorID 
write-hosts $user.SequenceNumber 
} 
} 
+1

我不能看到你创建'$ contentxml'的地方,我是盲目的?还请发布xml元素'POSLogTransaction' – Paul 2014-11-14 23:05:00

回答

1

我不知道你的意图,但我看到一个可能的解决方案。首先,此代码:

$XMLtmp = foreach ($user in $XMLFile.POSLog.POSLogTransaction) 
{ 
    $user.RetailStoreID 
    $user.WorkStationID 
    $user.OperatorID 
    $user.SequenceNumber 
} 

您似乎再也没有使用过$ XMLtmp了。此外,它只是将包含字符串数组,不是有像$ user.RetailStoreID

属性你可以做的是这样的:

$users = @() 

Register-ObjectEvent -InputObject $fswXML -EventName Created -SourceIdentifier CreatedEventXML -Action { 
    $Filename = $Event.SourceEventArgs.Name 
    [XML]$XMLFile = (Get-Content $Foldertowatch\$Filename) 
    foreach ($user in $XMLFile.POSLog.POSLogTransaction) { 
    $users += $user 
    } 
} 

后来的后来,你可以索引该数组。有多个用户吗?你想发送多个电子邮件吗?

在这一点上,你可以做到以下几点:

$users | % { Write-Host $_.RetailStoreId } 

您在foreach() {}创建$用户变量超出范围(又名“消失”)时,}被击中。 $ XMLtmp是不必要的。在Actionforeach范围之外声明$users可确保它对整个脚本是全局的。