Tarkvara paigaldus ja Powershell

Tarkvara paigaldus on üldjuhul lihtne.  Käivitad paigaldusprogrammi ja see teeb kõik ülejäänu.  Aga kui ei tee?  Teeb valesti või polegi paigaldusprogrammi?  Siis tuleb natuke kaasa aidata.

Programmifailide kopeerimine peaks olema lihtne.  Natuke keerulisem on otseteede tegemine.  Sest enamasti tahame me otseteid teha kas Start-menüüsse või näiteks töölauale või siis kiirkäivitusribale.  Aga kõigi nende kaustade asukohad on erinevad, sõltuvalt operatsioonisüsteemi versioonist ja keelest.

Näiteks selline lihtne kaust, nagu kasutaja isiklik töölaud.  Näiteks Windows XP-s on see c:\Documents and Settings\kasutaja\Desktop, aga Windows 7-s on see hoopis c:\Users\kasutaja\Desktop.  Lisaks kõigele muule on veel vaja teada kasutajanime.

Siin koha peal võiks kasutada keskkonnamuutujaid.  Näiteks:

$desktopPath = Join-Path $Env:USERPROFILE "Desktop"
Get-Item $desktopPath

Mõnejagu keerulisem on saada kasutajate ühist töölauda.  Windows XP puhul on võimalik kasutada keskkonnamuutujat ALLUSERSPROFILE, ent Vista/Win7 all tuleb kasutada keskkonnamuutujat PUBLIC.  Ja juba tulebki hakata uurima, et mis OS versiooni peal skript käib.

Õnneks on olemas muud viisid.  Nimelt saab Windowsi enda käest küsida, kui teada, mida täpselt.  Nimelt on Windows Shell täiesti teadlik sellistest kaustadest:

$Desktop = 0  # ShellSpecialFolderConstants.ssfDESKTOP
$shell = New-Object -ComObject "Shell.Application"
$desktopPath = $Shell.NameSpace($Desktop).Self.Path

Spetsiaalsete kaustade nimekirja saab MDSNist.

Samaks eesmärgiks saab kasutada ka .NET Framework’i abi:

$Desktop = [System.Environment+SpecialFolder]::Desktop
$desktopPath = [System.Environment]::GetFolderPath($Desktop)

  # tegelikult saab ka nii
$desktopPath = [System.Environment]::GetFolderPath("Desktop")

Spetsiaalsete kaustade nimekirja saab jälle MSDNist või siis järgmise käsuga:

[Enum]::GetValues([System.Environment+SpecialFolder])

Ainsaks probleemiks võib olla see, et näiteks kõigi kasutajate töölaud on .Net Framework 2.0-st (ja ka 3.5-st) puudu.  Ja 4.0-i kasutab alles PowerShell 3.0.

On veel ka kolmas viis.  Nimelt sai ka Windows Scripting Host kasutada sarnast viisi spetsiaalsete kaustade leidmiseks.  Ja miski ei takista meid PowerShellist sedasama tegemast:

$wshshell = New-Object -ComObject WScript.Shell
$desktopPath = $wshshell.SpecialFolders.Item("Desktop")

Spetsiaalsete kaustade nimekirja saab jällegi MSDNist.

Nüüd kus kaustad on lõpuks üles leitud, võib asuda otseteede loomisele.  Ja jällegi on lihtsaim viis laenata Windows Scripting Host’i oskusi, antud juhul siis CreateShortcut meetodit:

$shortcutPath = Join-Path $desktopPath "otsetee.lnk"
$shortcut = $wshshell.CreateShortcut($shortcutPath)
$shortcut.TargetPath = "c:\Program Files\Internet Explorer\iexplore.exe"
$shortcut.Save()

Ja ongi link valmis.  Soovi korral võib nüüd samamoodi teha linke Start-menüüsse või mujale, kuhu parajast tarvidust on.

Windows 7 keskkonnas võib veel tekkida tahtmine kinnitada programmi otsetee tegumiribale või Start-menüüsse . Selleks on Powershellile kirjutatud vastav moodul.

Advertisements