Centrum skryptów - Microsoft office

Jak utworzyć dokument programu Microsoft Word na podstawie informacji WMI?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak utworzyć dokument programu Microsoft Word na podstawie informacji WMI?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Chciałabym użyć programu Windows PowerShell (j.ang.) w celu uzyskania określonych informacji z WMI, a następnie zapisać te informacje w dokumencie programu Microsoft Word. Wiem, że można utworzyć plik tekstowy przy użyciu metody Out-File, ale takie pliki są nieciekawe. Chcę użyć programu Word, aby w razie potrzeby dodać kolory, obramowania i grafikę. Proszę o pomoc!

-- GS

Cześć Skrypciarze! Pytanie

Cześć, GS! Pliki tekstowe nieciekawe? No wiesz? Ja uwielbiam pliki tekstowe. Prawie nie zajmują miejsca na dysku, wymagają minimalnej ilości pamięci i można je bez problemu przenosić między różnymi platformami. Myślę, że Notatnik to najlepszy program opracowany kiedykolwiek przez firmę Microsoft. Uzyskał pełną funkcjonalność niemal 20 lat temu i praktycznie nigdy nie znaleziono w nim błędu. Zgadzam się jednak, że kolory, obramowania i grafika to ciekawe dodatki do dokumentu.

Poniższe zdjęcie rafy koralowej, zrobione przeze mnie kilka tygodni temu podczas nurkowania na Kajmanach, nie ma nic wspólnego z artykułem. Ale, jak widać, sprawia, że staje się on ciekawszy. Szczególnie, że na Małym Kajmanie morze miało 29 stopni Celsjusza, a u mnie w Charlotte jest teraz -2 stopnie przy ziemi.

GS, mimo całej mojej sympatii do Notatnika (w niektórych środowiskach zwanego Edytorem skryptów firmy Microsoft), postanowiłem Ci pomóc, ponieważ uwielbiam WMI (a nawet jestem autorem bestsellera na ten temat (j.ang.) i pisanie skryptów obsługujących program Microsoft Word. No dobra, koniec wygłupów — przedstawiam skrypt WriteBiosInfoToWord.ps1. Jeśli jesteś zainteresowana skryptem w języku VBScript, umieszczającym informacje WMI w dokumencie programu Word zajrzyj do Repozytorium skryptów (j.ang.). Skrypt ten jednak nie zapisuje danych, jedynie wyświetla je w dokumencie programu Word.

WriteBiosInfoToWord.ps1

$class = "Win32_Bios"

$path = "C:\fso\bios"



[ref]$SaveFormat = "microsoft.office.interop.word.WdSaveFormat" -as [type]

$word = New-Object -ComObject word.application

$word.visible = $true

$doc = $word.documents.add()

$selection = $word.selection

$selection.typeText("To są informacje o biosie")

$selection.TypeParagraph()

Get-WmiObject -class $class | 

Out-String |

ForEach-Object { $selection.typeText($_) }

$doc.saveas([ref] $path, [ref]$saveFormat::wdFormatDocument)

$word.quit()

Na początku skryptu WriteBiosInfoToWord.ps1 tworzymy dwie zmienne i przypisujemy im wartości. Pierwsza zmienna to $class (w Windows PowerShell wszystkie zmienne zaczynają się znakiem dolara). Zawiera ona nazwę klasy WMI, do której wyślemy kwerendę. W tym skrypcie korzystamy z klasy WMI Win32_Bios, ale istnieje wiele innych klas WMI, których moglibyśmy użyć. Wszystkie są szczegółowo opisane w dokumentacji WMI w witrynie MSDN (j.ang.). Druga zmienna, której użyjemy, to $path. Zawiera ona informacje o dysku, folderze i nazwie dokumentu, który chcemy utworzyć. Należy zwrócić uwagę, że nie zawiera ona rozszerzenia pliku. Użyjemy programu Word do wygenerowania odpowiedniego rozszerzenia po zapisaniu pliku. Oto te dwie zmienne:

$class = "Win32_Bios"

$path = "C:\fso\bios"

Teraz używamy operatora -as, aby przekształcić ciąg znaków „Microsoft.Office.Interop.Word.WdSaveFormat” w typ. Używamy typu [ref], dzięki czemu możemy przekazać ten typ jako referencję, co jest wymogiem metody saveas (j.ang.) programu Word. Tworząc typ WdSaveFormat, uzyskujemy dostęp do wyliczeń WdSaveFormt (j.ang.), dzięki czemu nasz skrypt jest łatwiejszy do napisania, zmodyfikowania i odczytania. Odpowiada za to poniższy wiersz kodu:

[ref]$SaveFormat = "microsoft.office.interop.word.WdSaveFormat" -as [type]

Chcąc pracować z programem Word, musimy utworzyć wystąpienie obiektu Word.Application. Metody i właściwości (elementy członkowskie) obiektu Word.Application są opisane w witrynie MSDN (j.ang.). Aby utworzyć obiekt Word.Application, używamy apletu polecenia New-Object i parametru -comobject. Nadajemy mu identyfikator programu Word.Application i przechowujemy w zmiennej $word. Chcemy widzieć, co się dzieje, więc ustawiamy wartość właściwości visible aplikacji Word na $true. Kod ten uruchamia program Word i sprawia, że staje się on widoczny, ale nie dodaje do niego żadnych dokumentów:

$word = New-Object -ComObject word.application

$word.visible = $true

Otrzymujemy w ten sposób puste okno programu Word. Nie jest to zbyt częsty widok, ponieważ zazwyczaj program Word po uruchomieniu automatycznie otwiera pusty dokument. Warto więc zwrócić na to uwagę:

Teraz musimy dodać dokument do programu Word. W tym celu używamy obiektu documents (j.ang.) i wywołujemy metodę add. Ciekawe, otrzymujemy obiekt documents (będący kolekcją), wysyłając kwerendę do właściwości documents (j.ang.) z obiektu application. Mając obiekt documents, możemy wywołać metodę add. Moglibyśmy bez trudu zapisać ten kod w dwu wierszach, tak jak widać to poniżej:

$collectionDocuments = $word.documents

$doc = $collectionDocuments.add()

Taki zapis byłby właściwie bardziej czytelny. Niestety kod byłby wtedy dwukrotnie dłuższy, a te wszystkie dodatkowe znaki dolarów jeszcze bardziej go wydłużają. Tak więc zastosowałem rozwiązanie z „podwójnymi kropkami”. Czytając od lewej do prawej, mamy obiekt Application przechowywany w zmiennej $word. Następnie kolekcja Documents zostaje zwrócona z właściwości documents. Następnie używamy metody add. Wszystko to w jednym, zwięzłym zdaniu. Następnie bierzemy kolejny dokument zwracany z metody add i przechowujemy go w zmiennej $doc:

$doc = $word.documents.add()

Tworzymy obiekt selection (j.ang.), wysyłając kwerendę do właściwości selection obiektu Word Application. Obiekt selection reprezentuje zaznaczony zakres tekstu, np. wyróżniony fragment tekstu lub punkt wstawiania w dokumencie. Jeśli w tekście nie ma wyróżnienia, obiekt będzie reprezentował punkt wstawiania. W naszym przykładzie w ogóle nie ma tekstu, więc jego zaznaczenie byłoby raczej trudne. Co się zatem dzieje? Nasz obiekt odnosi się do punktu wstawiania.

$selection = $word.selection

Ten fragment jest trochę trudniejszy. Trzeba się skoncentrować i chwilę pomyśleć. Jakiej metody należy użyć, aby wpisać tekst w dokumencie programu Word? Jeśli zgadłaś, że chodzi o metodę TypeText, moje gratulacje! Kolejne pytanie jest trochę trudniejsze, ale spróbuj: jakiej metody użyć, aby na stronie umieścić pusty akapit? Oczywiście! Użyjemy metody TypeParagraph. Zatem poniższe dwa wiersze kodu nie będą zaskoczeniem:

$selection.typeText("To są informacje o biosie")

$selection.TypeParagraph()

Używamy apletu polecenia Get-WmiObject w Windows PowerShell, aby wysłać kwerendę do WMI. Przekazujemy klasę, którą przechowaliśmy w zmiennej $class, do parametru -class. Rezultat widać poniżej:

PS C:\Documents and Settings\ed> Get-WmiObject -Class win32_bios

SMBIOSBIOSVersion : A01

Manufacturer      : Dell Computer Corporation

Name              : Default System BIOS

SerialNumber      : 9HQ1S21

Version           : DELL   - 6

Szczególną zaletą Windows PowerShell jest to, że możemy uzyskać duże ilości informacji bez potrzeby długiego wpisywania z klawiatury.

Osobiście nie znoszę pisać na klawiaturze (co nie jest zbyt korzystne, skoro utrzymuję się z pisania). Mam jednak ciągle nadzieję, że uda się opracować na tyle skuteczne rozpoznawanie głosu, że będę mógł pisać, mówiąc. W systemie Windows Vista i programie Word 2007 już prawie się to udało, ale ta funkcja ciągle nie nadaje się do codziennego, intensywnego użytku. Wygląda ciekawie na prezentacjach i można z nią robić różne sztuczki, ale… Przepraszam, odchodzę od tematu. To przez słońce, które właśnie wyszło zza chmur.

Bierzemy informacje uzyskane z apletu polecenia Get-WmiObject i wysyłamy uzyskany w ten sposób obiekt do apletu polecenia Out-String. Trzeba bowiem pamiętać, że wszystko w Windows PowerShell jest obiektem. Gdybyśmy chcieli zapisać wyniki działania apletu polecenia Get-WmiObject bezpośrednio w programie Word, użylibyśmy czegoś w rodzaju System.Object[]. Musimy więc przekształcić nasz obiekt w ciąg znaków. Pobieramy więc reprezentację naszych danych w postaci ciągu znaków i przesyłamy ją potokiem do apletu polecenia Foreach-object. Widać to poniżej:

Get-WmiObject -class $class | 

Out-String |

Aplet polecenia Foreach-Object jest taki sam, jak instrukcja Foreach, poza tym, że jest na tyle sprytny, aby poradzić sobie z danymi w potoku. Chcemy, aby każdy element danych przechodzących przez potok był zapisywany w dokumencie programu Word przy użyciu metody TypeText obiektu Selection. $_ to automatyczna zmienna, oznaczająca bieżący element w potoku. Widać to poniżej:

ForEach-Object { $selection.typeText($_) }

Chcemy zapisać utworzony dokument programu Word. Ponieważ nie był on jeszcze zapisywany, chcemy określić jego nazwę. W tym celu używamy metody SaveAs obiektu Document. Teraz wracamy do triku z [ref]. Musimy przekazać odpowiednie wartości do wywołania method w postaci obiektów referencji. Dlatego też przed wartościami wpisujemy [ref]. Wyliczenie wdFormatDocument instruuje program Word, by zapisać dokument w domyślnym formacie. Działa to identycznie w programie Word 2007 i Word 2003. W programie Word 2007 uzyskamy plik docx, a w programie Word 2003 — doc.

$doc.saveas([ref] $path, [ref]$saveFormat::wdFormatDocument)

Teraz, kiedy skończyliśmy tworzenie i zapisywanie dokumentu programu Word, chcemy zamknąć ten program. W tym celu używamy metody quit, tak jak widać to poniżej:

$word.quit()

Przyglądając się uważnie po uruchomieniu skryptu, moglibyśmy zauważyć mignięcie dokumentu programu Word. Chodziłem wprawdzie na kurs szybkiego czytania, ale nie przykładałem się zbytnio, więc nie jestem w stanie przeczytać naszego dokumentu w ułamku sekundy. Otwórzmy go zatem. Oto i on:

Mam nadzieję, GS, że ten skrypt Ci się przyda. Uwielbiam tę technikę, a jej użycie w Windows PowerShell jest łatwe i daje ogromne możliwości dzięki automatycznemu rozszerzaniu właściwości WMI. Do zobaczenia!

Skrypciarze Ed Wilson i Craig Liebendorfer

 Do początku strony Do początku strony

Centrum skryptów - Microsoft office