Alkalmazások kezelése

A COM által nyújtott interfész lehetővé teszi, hogy nem csak a Windows különböző funkcióit tudjuk elérni, hanem a legtöbb alkalmazás is elérhetővé tesz olyan objektumokat, amelyek hasznos szolgáltatásait felhasználhatjuk szkriptjeinkben.

Internet Explorer

A legegyszerűbb vonatkozó példa az Internet Explorer megszólítása. Elsőként látható módon elindítom az alkalmazást:

[17] PS C:\> $ie = New-Object -ComObject InternetExplorer.Application

[18] PS C:\> $ie.visible=$true

Nézzük meg, hogy mit tartalmaz még a $ie változó:

PS C:\> $ie | Get-Member

 

 

   TypeName: System.__ComObject#{d30c1661-cdaf-11d0-8a3e-00c04fc9e26e}

 

Name                 MemberType Definition

----                 ---------- ----------

ClientToWindow       Method     void ClientToWindow (int, int)

ExecWB               Method     void ExecWB (OLECMDID, OLECMDEXECOPT, Varia...

GetProperty          Method     Variant GetProperty (string)

GoBack               Method     void GoBack ()

GoForward            Method     void GoForward ()

GoHome               Method     void GoHome ()

GoSearch             Method     void GoSearch ()

Navigate             Method     void Navigate (string, Variant, Variant, Va...

Navigate2            Method     void Navigate2 (Variant, Variant, Variant, ...

PutProperty          Method     void PutProperty (string, Variant)

QueryStatusWB        Method     OLECMDF QueryStatusWB (OLECMDID)

Quit                 Method     void Quit ()

Refresh              Method     void Refresh ()

Refresh2             Method     void Refresh2 (Variant)

ShowBrowserBar       Method     void ShowBrowserBar (Variant, Variant, Vari...

Stop                 Method     void Stop ()

AddressBar           Property   bool AddressBar () {get} {set}

Application          Property   IDispatch Application () {get}

Busy                 Property   bool Busy () {get}

Container            Property   IDispatch Container () {get}

Document             Property   IDispatch Document () {get}

FullName             Property   string FullName () {get}

FullScreen           Property   bool FullScreen () {get} {set}

Height               Property   int Height () {get} {set}

HWND                 Property   int64 HWND () {get}

Left                 Property   int Left () {get} {set}

LocationName         Property   string LocationName () {get}

LocationURL          Property   string LocationURL () {get}

MenuBar              Property   bool MenuBar () {get} {set}

Name                 Property   string Name () {get}

Offline              Property   bool Offline () {get} {set}

Parent               Property   IDispatch Parent () {get}

Path                 Property   string Path () {get}

ReadyState           Property   tagREADYSTATE ReadyState () {get}

RegisterAsBrowser    Property   bool RegisterAsBrowser () {get} {set}

RegisterAsDropTarget Property   bool RegisterAsDropTarget () {get} {set}

Resizable            Property   bool Resizable () {get} {set}

Silent               Property   bool Silent () {get} {set}

StatusBar            Property   bool StatusBar () {get} {set}

StatusText           Property   string StatusText () {get} {set}

TheaterMode          Property   bool TheaterMode () {get} {set}

ToolBar              Property   int ToolBar () {get} {set}

Top                  Property   int Top () {get} {set}

TopLevelContainer    Property   bool TopLevelContainer () {get}

Type                 Property   string Type () {get}

Visible              Property   bool Visible () {get} {set}

Width                Property   int Width () {get} {set}

Navigáljunk el egy weboldalra:

PS C:\> $ie.Navigate("http://www.iqjb.hu")

PS C:\> $ie.Busy

False

Érdemes vizsgálni a Busy tulajdonságot, mert amikor annak értéke $False-ra vált, akkor fejeződött be az oldal letöltése. Nézzünk bele a letöltött oldalba:

PS C:\> $ie.Document

 

 

Script                            :

all                               : System.__ComObject

body                              : System.__ComObject

activeElement                     : System.__ComObject

images                            : System.__ComObject

applets                           : System.__ComObject

links                             : System.__ComObject

forms                             : System.__ComObject

anchors                           : System.__ComObject

title                             : IQSOFT - John Bryce Oktatóközpont

scripts                           : System.__ComObject

designMode                        : Inherit

selection                         : System.__ComObject

readyState                        : complete

frames                            :

embeds                            : System.__ComObject

plugins                           : System.__ComObject

alinkColor                        : #0000ff

bgColor                           : #ffffff

fgColor                           : #17426a

linkColor                         : #0000ff

vlinkColor                        : #800080

Nagyon sok tulajdonsága van, így csak egy részét másoltam ide. Ezek közül a weboldal HTML tartalma kiolvasható a következő tulajdonságon keresztül:

PS C:\> $ie.Document.body.innerHTML

<TABLE border=0 cellSpacing=0 cellPadding=0 width="99%">

<TBODY>

<TR>

<TD width="99%">

<TABLE border=0 cellSpacing=0 cellPadding=0 width="100%">

<TBODY>

<TR>

<TD background=/Images/Page2/fejlechatter.gif align=left><A href="http://www.i

qjb.hu" target=_parent><IMG border=0 src="/Images/Page2/fejlec.gif" useMap=#fe

jlecMap></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>

<TABLE border=0 cellSpacing=0 cellPadding=0 width="99%">

Az emberi szemnek olvasható nyers szöveg pedig kinyerhető a következő tulajdonsággal:

PS C:\> $ie.Document.body.innerText | ForEach-Object {$_ -replace "\r\n", ""}

Microsoft Tesztelés tanfolyamok Biztonságtechnikai tanfolyamok Java, C++, Corb

a, XML Eclipse Cisco, hálózati technológiák Oracle (BEA) IBM Sybase Agilis, UM

L, RUP modellezési, tervezési módszertanok SuSE Linux Check Point ITIL, ITC, P

rojektirányítás, Minőségbiztosítás Szemináriumok Irodai szoftverek Pénzügy, HR

(A sok soremelés miatt ezeket egy –replace kifejezéssel kiszedtem.)

Microsoft Word

Nézzünk egy kicsit bonyolultabb példát, olvastassunk be egy Word dokumentumot, de csak az emberi fogyasztásra szánt értelmes szöveget! Ez nem olyan egyszerű feladat, hiszen ha egyszerű fájlművelettel próbálkoznánk, akkor a Word dokumentum mindenféle formázó információját is beolvassuk, és abból elég nehéz kinyerni a tényleges szöveget. Szerencsére a Word is rendelkezik COM felülettel, így az alábbi néhány soros szkripttel könnyen felolvastathatjuk az „igazi” szöveget a dokumentumból:

[25] PS I:\>$wordApp = New-Object -COM Word.Application

[26] PS I:\>$file = (Get-Item C:\_docs\tematikák.docx).FullName

[27] PS I:\>$doc = $wordApp.Documents.Open($file)

[28] PS I:\>$text = $doc.Content.Text

[29] PS I:\>$text

Microsoft PowerShell for Administrators Who Should AttendAnyone Who Scrip

ts For Windows - this course will help you build scripting skills in PowerS

hell when you are coming from a background in scripting on Windows operatin

...

[30] PS I:\>$wordApp.Quit()

A szkript elején megszólítom a Word.Application COM objektumot és betöltöm a $wordApp változóba, majd a megnyitandó dokumentum elérési útját berakom egy változóba, majd a $wordApp segítségével megnyitom ezt a fájlt. Mivel nem rendelkeztem arról, hogy a Word látható legyen, mindez csak a háttérben történik. A fájl megnyitásával egy új objektumhoz jutok, magához a dokumentumhoz, majd ennek veszem a nyers szöveges részét a $doc.Content.Text kifejezés segítségével, amit a [29]-es sorban ki is írattam a konzolra.

Ilyen jellegű alkalmazások kezelésekor illik azokat a végén bezárni, hogy ne foglalja feleslegesen a memóriát. Ezt a [30]-as sorban tettem meg.

Microsoft Excel

A Microsoft Excel is elérhető COM objektumként. Sajnos az Excel 2010 előtti verziók esetében, ha nem amerikai angol a Windows területi beállítása, akkor egy hiba miatt a cellák elérésénél hibával „elszállt” a művelet. Az alábbi példában Excel 2010-et használtam, itt már nem jött elő ez a hiba.

$excelapp = New-Object -comobject Excel.Application

 

$excelapp.Visible = $True

 

$workbook = $excelapp.Workbooks.Add()

$sheet = $workbook.Worksheets.Item(1)

 

$sheet.Cells.Item(1,1) = 7

$sheet.Cells.Item(1,2) = "=fact(a1)"

A fenti példában megnyitottam az Excel alkalmazást COM objektumként, láthatóvá tettem, majd nyitottam egy munkafüzetet és annak első lapját a $sheet változóhoz rendeltem. Ennek a munkalapnak az „A1”-es cellájába 7-et töltöttem, a „B1”-es cellájába egy Excel függvényt, „=fact(a1)”-et.

Visszaolvasni ezeket a következő módon lehet:

PS C:\> $sheet.Cells.Item(1,2).formula

=FACT(A1)

PS C:\> $sheet.Cells.Item(1,2).value2

5040

Látható, hogy ki lehet olvasni mind a képletet (formula tulajdonság), mind az értéket (value2 tulajdonság).

Munkafüzeteket elmenteni a legfrissebb Excel verziókban nem egyszerű, mert kötelező megadni a formátumot, nincs alaphelyzet szerinti érték. Az alábbi példában a normál módon történő mentés látható, majd zárom a munkalapot:

$workbook.SaveAs("C:\_munka\Test.xlsx",-4143)

$workbook.Close()

Az alábbi táblázat a lehetséges mentési formátumokat tartalmazza:

Név

Érték

Jelentés

xlAddIn

18

Microsoft Excel 97-2003 Add-In

xlAddIn8

18

Microsoft Excel 97-2003 Add-In

xlCSV

6

CSV

xlCSVMac

22

Macintosh CSV 

xlCSVMSDOS

24

MSDOS CSV

xlCSVWindows

23

Windows CSV 

xlCurrentPlatformText

-4158

Current Platform Text

xlDBF2

7

DBF2

xlDBF3

8

DBF3

xlDBF4

11

DBF4

xlDIF

9

DIF

xlExcel12

50

Excel12

xlExcel2

16

Excel2

xlExcel2FarEast

27

Excel2 FarEast

xlExcel3

29

Excel3

xlExcel4

33

Excel4

xlExcel4Workbook

35

Excel4 Workbook

xlExcel5

39

Excel5

xlExcel7

39

Excel7

xlExcel8

56

Excel8

xlExcel9795

43

Excel9795

xlHtml

44

HTML format

xlIntlAddIn

26

International Add-In

xlIntlMacro

25

International Macro

xlOpenDocumentSpreadsheet

60

OpenDocument Spreadsheet

xlOpenXMLAddIn

55

Open XML Add-In

xlOpenXMLTemplate

54

Open XML Template

xlOpenXMLTemplateMacroEnabled

53

Open XML Template Macro Enabled

xlOpenXMLWorkbook

51

Open XML Workbook

xlOpenXMLWorkbookMacroEnabled

52

Open XML Workbook Macro Enabled

xlSYLK

2

SYLK

xlTemplate

17

Template

xlTemplate8

17

Template 8

xlTextMac

19

Macintosh Text

xlTextMSDOS

21

MSDOS Text

xlTextPrinter

36

Printer Text

xlTextWindows

20

Windows Text

xlUnicodeText

42

Unicode Text

xlWebArchive

45

Web Archive

xlWJ2WD1

14

WJ2WD1

xlWJ3

40

WJ3

xlWJ3FJ3

41

WJ3FJ3

xlWK1

5

WK1

xlWK1ALL

31

WK1ALL

xlWK1FMT

30

WK1FMT

xlWK3

15

WK3

xlWK3FM3

32

WK3FM3

xlWK4

38

WK4

xlWKS

4

Worksheet

xlWorkbookDefault

51

Workbook default

xlWorkbookNormal

-4143

Workbook normal

xlWorks2FarEast

28

Works2 FarEast

xlWQ1

34

WQ1

xlXMLSpreadsheet

46

XML Spreadsheet

Ha egy meglevő Excel táblát akarunk megnyitni, akkor ezt a megnyitott Excel com objektum birtokában a következőképpen tehetjük ezt meg:

$excelapp.Workbooks.Open("C:\_munka\Test.xlsx")

$workbook = $excelapp.Workbooks.Item(1)

$sheet = $workbook.Worksheets.item(1)

$sheet.Cells.item(1,3) = "Save után"

$workbook.Save()

 

$excelapp.Quit()

Ilyenkor az „újramentés” már egyszerűbb, a Save metódus nem igényel paramétert.



Word To HTML Converter