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.
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.)
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.
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.