Tehnoloogia » Muud tooted ja tehnoloogiad » PowerShell (ja 7zip)


 
PowerShell (ja 7zip)
KassOggieKassOggie
Posted: 17. juuli 2012, 05:01 Vasta  |  Tsiteeri  

Tere!

Kuna see on mu esimene PS skript ja juba on juhe koos, siis küsin nõu targematelt.

Teha on vaja järgmist: Task Scheduleriga lasta iga päev käima skript, mis pakiks 7zip-iga kokku faili nimega PAyymmdd.TXT ning kustutaks selle TXT faili seejärel ära. (yymmdd on kuupäev)

Lisaboonusena oleks muidugi enne kustutamist kontroll, kas 7zip'i exit code ikka oli 0.

Teine boonus oleks, kui saaks selle tekkinud faili kopeerida teise arvutisse parooliga kaitstud share peale. Kas kaitstud sharele ligisaamiseks on vaja PS 3.0 või saab seda PS 2.0 ja new-psdrive abil ka teha?

Ei ole ma kaugemale saanud kui need read:

 

#set-executionpolicy remotesigned
$aeg=get-date -format yyMMdd
$k2sk='"c:\Program Files\7-Zip\7z.exe"'
$algfail='"c:\Program Files\minu proge\koopia\PA'+$aeg+'.TXT"'
$l6ppfail='"c:\Program Files\minu proge\koopia\PA'+$aeg+'.7z"'
$parameeter='a -t7z '+$l6ppfail+' -ptopsecret -mx9 '+$algfail

Invoke-Expression "$k2sk $parameeter" | out-Null
#Remove-Item $algfail

Mida ma siin valesti teen?

PS C:\> .\test.ps1
Invoke-Expression : Unexpected token 'a' in expression or statement.
At C:\test.ps1:8 char:18
+ Invoke-Expression <<<< "$k2sk $parameeter" | out-Null
+ CategoryInfo : ParserError: (a:String) [Invoke-Expression], ParseException
+ FullyQualifiedErrorId : UnexpectedToken,Microsoft.PowerShell.Commands.In
vokeExpressionCommand

PS C:\> exit

Kas järgnev veateade tuleneb eelmisest või olen ma siin ka puusse pannud?

C:\>powershell test.ps1
The term 'test.ps1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was in cluded, verify that the path is correct and try again.
At line:1 char:9
+ test.ps1 <<<<
+ CategoryInfo : ObjectNotFound: (test.ps1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Muudetud: 17:02 | 17.07.2012 | KassOggie
warwaswarwas
Posted: 18. juuli 2012, 11:12 Vasta  |  Tsiteeri  

Proovi nii:

Invoke-Expression "& $k2sk $parameeter" | out-Null

KassOggieKassOggie
Posted: 18. juuli 2012, 02:23 Vasta  |  Tsiteeri  

Aitäh! Ei olnudki palju mööda, aga ise enam välja ka ei mõelnud. Kui nüüd kopeerimise ka kuidagi tehtud saaks, oleks täitsa OK.

Tulemus siis praegu selline:

$aeg=get-date -format yyMMdd
$k2sk='"c:\Program Files\7-Zip\7z.exe"'
$algfail="c:\Program Files\minu proge\koopia\PA"+$aeg+".TXT"
$l6ppfail="c:\Program Files\minu proge\koopia\PA"+$aeg+".7z"
$parameeter='a -t7z "'+$l6ppfail+'" -ptopsecret -mx9 "'+$algfail+'"'
Invoke-Expression "& $k2sk $parameeter" | out-Null
if (!($LASTEXITCODE)) {Remove-Item "$algfail"}

warwaswarwas
Posted: 20. juuli 2012, 06:01 Vasta  |  Tsiteeri  

Sa BITS'i pole proovinud? A'la midagi sellist:

Import-Module bitstransfer
$cred = Get-Credential()
$sourcePath = C:\Local\file.txt
$destPath = \\server\example\
Start-BitsTransfer -Source $sourcePath -Destination $destPath -Credential $cred

Muidugi võid ka net use abil omale ketta külge mountida, nänni ära kopeerida ja lõpuks ketta uuesti küljest lahti võtta.

KassOggieKassOggie
Posted: 24. juuli 2012, 02:09 Vasta  |  Tsiteeri  

Ei saanud selle BITSiga hetkel hakkama.
Töötab selline variant:
$parool=ConvertTo-SecureString "paroolikene" -asplaintext -force
$cred=New-Object System.Management.Automation.PSCredential("kasutajanimi",$parool)
New-PSDrive -name x -Psprovider FileSystem -root \\server\share -credential $cred
Copy-Item $l6ppfail x:

Puudused:
1) vaja on PS 3.0, mis veel ilmunud pole ja beetat installida ei taha.
2) paroolid on liiga avalikult skriptis näha

MeelisMeelis
Posted: 06. aug 2012, 03:06 Vasta  |  Tsiteeri  
KassOggie kirjutas:
 

Teha on vaja järgmist: Task Scheduleriga lasta iga päev käima skript, mis pakiks 7zip-iga kokku faili nimega PAyymmdd.TXT ning kustutaks selle TXT faili seejärel ära. (yymmdd on kuupäev)

Kui juba Task Sheculeri kasutad, siis saad oma skripti käivitada sobiva kasutaja õigustes.  Sellisel juhul pole vaja kontot/parooli skripti sisse kirjutada.

KassOggie kirjutas:

Teine boonus oleks, kui saaks selle tekkinud faili kopeerida teise arvutisse parooliga kaitstud share peale. Kas kaitstud sharele ligisaamiseks on vaja PS 3.0 või saab seda PS 2.0 ja new-psdrive abil ka teha?

failishare kasuatmiseks pole vaja ei ketast mappida ega PSDrive'i luua.  Piisab kui kopeerimise käsule anda sobiv URL.  Kui skripti jooksutav kasutaja ei saa võrgukettale ligi, siis võiks talle ligipääsu tekitada.

KassOggie kirjutas:

#set-executionpolicy remotesigned
$aeg=get-date -format yyMMdd
$k2sk='"c:\Program Files\7-Zip\7z.exe"'
$algfail='"c:\Program Files\minu proge\koopia\PA'+$aeg+'.TXT"'
$l6ppfail='"c:\Program Files\minu proge\koopia\PA'+$aeg+'.7z"'
$parameeter='a -t7z '+$l6ppfail+' -ptopsecret -mx9 '+$algfail

Invoke-Expression "$k2sk $parameeter" | out-Null

kuna programmi teekond sisaldab tühikut (c:\program files\7-zip\7z.exe), siis arvab Powerhell 2.0, et tegemist on stringiga.  Selle vältimiseks tuleb käsurea algusesse lisada väljakutse tehe "& ".  Ja sellisel juhul saab antud rea kirjutada juba kujul:

& $k2sk $parameeter

või siis ilma tehteta:

start-process $k2sk -argumentlist $parameeter -wait

Muudetud: 23:40 | 28.08.2012 | Meelis
MeelisMeelis
Posted: 06. aug 2012, 03:15 Vasta  |  Tsiteeri  
KassOggie kirjutas:

1) vaja on PS 3.0, mis veel ilmunud pole ja beetat installida ei taha.
2) paroolid on liiga avalikult skriptis näha

1) PS 3.0-ga töötavad kõik 2.0 skriptid.  Mõningaid asju saab lihtsamalt/paremini teha, aga muidu peaksid kõik varasemad asjad töötama.

2) parooli skripti sisse kirjutamise asemel tasub skripti käivitada kasutajana, kel kõik vajalikud õigused olemas.  Kui domeenikontosid kasutada ei saa (teine AD mets või domeeni pole), siis saab ära kasutada Windows'i autentimise loogikat.  Ehk siis tuleb luua lokaalsesse masinasse sama nime ja parooliga kasutajakonto, kui on olemas sihtmasinas.

Muudetud: 13:23 | 26.08.2012 | Meelis