2014-11-14 108 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可確保它對整個腳本是全局的。