2014-11-14 3 views
0

오류 폴더를 모니터링하고 오류가 발생하면 전자 메일을 보내는 스크립트를 작성하고 있습니다. 각 오류에 대해 폴더에 두 개의 파일, 하나의 텍스트 파일 및 하나의 XML이 표시됩니다. 전자 메일에서 텍스트 파일의 전체 내용과 xml 파일의 내용 중 일부를 포함하려고합니다.Powershell 변수가 "lost"가되었습니다.

다음 스크립트에서는 텍스트 파일의 내용 만 가져옵니다. (이메일을 보내는 라인은 테스트 목적으로 주석 처리되어 있습니다). 나는 변수와 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'을 (를) 작성한 곳을 볼 수 없습니다. 또한 blind입니까? 또한 XML 요소 인'POSLogTransaction'을 게시하십시오. – Paul

답변

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는 불필요합니다. $usersActionforeach의 범위를 벗어나 선언하면 전체 스크립트에 대해 전역 적입니다.

관련 문제