Powershell - valtozora szures

Sziasztok,

Az egy powershell script, amivel egy txt fileban akarok szurni.

ket feltetel van, egy nev (Portás) es datum. (yyyy-mm-dd)

$last_day=(Get-Date).AddDays(-1).ToString('yyyy-MM-dd')
$p = @("Portás,$last_day")
Get-Content 'C:\Users\nsuto\Desktop\EXPORT_SECURITY.txt' | Select-String -Pattern $p -SimpleMatch | Set-Content C:\Users\nsuto\Desktop\FilteredContent.txt

minden jo, amig nem szurok valtozora, akkor nem is jon letre a kimeneti fajl. Elv a txt-ben a datum formatum ugyanez, yyyy-mm-dd, ezek az elvalaszto karakterek is.

Ha siman kiiratom a valtozot, akkor jo ertek jon ki, jol formazva...

Hol a hiba, a szuresnel miert nem megy?

Hozzászólások

ok kozben arra rajottem, h az elvalasztast elkurtam :)

$p = @("Portás","$last_day")

Igy mar letrejon a kimeneti fajl, de meg mindig nem szur, csak "Portás"-ra...

Kozben targytalan, sikerult :D

(egy hetre kellett leszurni)

$01=(Get-Date).AddDays(-1).ToString('yyyy-MM-dd')
$02=(Get-Date).AddDays(-2).ToString('yyyy-MM-dd')
$03=(Get-Date).AddDays(-3).ToString('yyyy-MM-dd')
$04=(Get-Date).AddDays(-4).ToString('yyyy-MM-dd')
$05=(Get-Date).AddDays(-5).ToString('yyyy-MM-dd')
$06=(Get-Date).AddDays(-6).ToString('yyyy-MM-dd')
$07=(Get-Date).AddDays(-7).ToString('yyyy-MM-dd')
$p1 = @("$01","$02","$03","$04","$05","$06","$07")
$p2 = @("Portás")
Get-Content 'C:\Users\nsuto\Desktop\EXPORT_SECURITY.txt' | Select-String -Pattern $p1 -SimpleMatch | Select-String -Pattern $p2 -SimpleMatch | Set-Content C:\Users\nsuto\Desktop\FilteredContent.txt

Na kesz is, elso Powershell scriptem :) Nagyon buszke vagyok magamra, pedig jo gane lehet egy programozo szemeben :D :P

De nekem a celnak megfelel. (mar at is alakiottam exe-be, mehet a feladatutemezobe)

#Adatok szurese utolso het nap es "Portas" alapjan
$01=(Get-Date).AddDays(-1).ToString('yyyy-MM-dd')
$02=(Get-Date).AddDays(-2).ToString('yyyy-MM-dd')
$03=(Get-Date).AddDays(-3).ToString('yyyy-MM-dd')
$04=(Get-Date).AddDays(-4).ToString('yyyy-MM-dd')
$05=(Get-Date).AddDays(-5).ToString('yyyy-MM-dd')
$06=(Get-Date).AddDays(-6).ToString('yyyy-MM-dd')
$07=(Get-Date).AddDays(-7).ToString('yyyy-MM-dd')
$p1 = @("$01","$02","$03","$04","$05","$06","$07")
$p2 = @("Portás")
#Adatok mentese csv-be, valamint idezojelek torlese
Get-Content 'C:\Users\nsuto\Desktop\EXPORT_SECURITY.txt' | Select-String -Pattern $p1 -SimpleMatch | Select-String -Pattern $p2 -SimpleMatch | Select-Object line | ConvertTo-Csv -NoTypeInformation | % {$_ -replace '"', ""} | Out-File C:\Users\nsuto\Desktop\FilteredContent.csv -Force -Append -encoding "unicode"
#csv-bol elso sor torlese
Get-Content C:\Users\nsuto\Desktop\FilteredContent.csv | select -Skip 1 | Set-Content C:\Users\nsuto\Desktop\FilteredContent_nofirstline.csv
#xlsx torlese, ha letezik
If (Test-Path C:\Users\nsuto\Desktop\FilteredContent.xlsx){
Remove-Item C:\Users\nsuto\Desktop\FilteredContent.xlsx
}
#Hely es elvalaszto meghatarozasa
$csv = "C:\Users\nsuto\Desktop\FilteredContent_nofirstline.csv" #Forrasfajl helye
$xlsx = "C:\Users\nsuto\Desktop\FilteredContent.xlsx" #Celfajl helye
$delimiter = ";" #Elvalaszto definialasa

#Uj excel munkafuzet letrehozasa ures lappal
$excel = New-Object -ComObject excel.application
$workbook = $excel.Workbooks.Add(1)
$worksheet = $workbook.worksheets.Item(1)

# QueryTables.Add felepitese es adat formazasa
$TxtConnector = ("TEXT;" + $csv)
$Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1"))
$query = $worksheet.QueryTables.item($Connector.name)
$query.TextFileOtherDelimiter = $delimiter
$query.TextFileParseType = 1
$query.TextFileColumnDataTypes = ,1 * $worksheet.Cells.Columns.Count
$query.AdjustColumnWidth = 1

# Lekerdezes fissitese es torlese
$query.Refresh()
$query.Delete()

#Munkafuzet mentese es bezarasa xlsx-kent
$Workbook.Saveas($xlsx,51)
$excel.Quit()
#Segedfajlok torlese, ha leteznek
If (Test-Path C:\Users\nsuto\Desktop\FilteredContent.csv){
Remove-Item C:\Users\nsuto\Desktop\FilteredContent.csv
}
If (Test-Path C:\Users\nsuto\Desktop\FilteredContent_nofirstline.csv){
Remove-Item C:\Users\nsuto\Desktop\FilteredContent_nofirstline.csv
}

#email kuldese a portanak smtpintern userrel

$From = "mailfrom"
$To = "mailto"
$SMTPServer = "ip"
$SMTPPort = "25"
$Username = "username"
$Password = "password"
$subject = "teszt"
$body = "teszt"
$attachment = "C:\Users\nsuto\Desktop\FilteredContent.xlsx"

$message = New-Object System.Net.Mail.MailMessage
$message.subject = $subject
$message.body = $body
$message.to.add($to)
$message.from = $From
$message.attachments.add($attachment)

$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);

$smtp.EnableSSL = $false
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$smtp.send($message)
write-host "Level elkuldve"

Néhány ötletet elfogadsz? :)

A $p1 nevű változót sokkal egyszerűbben is előállíthatod, pl.:


$p1 = 1..7 | % {(Get-Date).AddDays(-$_)}

$p2 lehet sima string is, el fogja fogadni a Select-String.

A CSV előállítására használhatod az Export-Csv cmdletet is, ez elfogadja az Out-File paramétereit is. Azonban arról nem lehet lebeszélni, hogy headert gyártson. Ha az mindenképp szükséges, hogy ne legyen header, akkor sajnos ez nem járható út.

Mindenesetre az biztos, hogy felesleges két csv-t előállítani, egyszerűen skippelheted az első sort még az Out-File előtt. Illetve az idézőjelekkel sem kell foglalkozni, az Excel simán kezeli azokat.

A törléseknél, ha ez neked elfogadható, mondhatod azt, hogy ignorálod a nem létező fájl miatt keletkező hibát:


Remove-Item $filename -ErrorAction Ignore

Persze így akkor is tovább fut a script, ha a fájl létezett, és valamiért nem sikerült törölni. Ha jobban tetszik az ellenőrzéssel egybekötött megoldás, akkor érdemes lenne ezt a kódrészletet kiemelni egy függvénybe.

Sajnos az Excel com-objecten keresztüli manipulálása és az email küldése elég sok boilerplate kódot igényel, de ezekre nincs ötletem.

Koszonom a valaszt :)

A $p1 nel en is gondoltam h sorozattal is meg lehet oldani, de nem tudtam a szintaxist :) koszi.

Eloszor export-csv-vel probaltam, annal asszem nem tudtam kiszedi az idezojeleket.

Probaltam idezojelekkel, de ugy nem ette meg az excel, vagyis megette, de egy oszlopba vagott be mindent...

Most amugy egy olyan gondom van, hogy win10 alatt irtam meg a scriptet, megy is szepen ott, de most, Win7 alatt nem kuldi el az email-t, megall auth hibaval.

Erre van esetleg valami otleted?

sajnos nemet a rendszer, bocs sracok:

Ausnahme beim Aufrufen von "Send" mit 1 Argument(en):  "Für den SMTP-Server ist eine sichere Verbindung erforderlich, oder der Client wurde nicht authentifiziert. Die Serverantwort war: 5.7.1 Client was not authenticated"
Bei Zeile:26 Zeichen:11
+ $smtp.send <<<< ($message)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException
 

Win10-nel megy, csak 7 nel all meg ezzel.