Vytváření objektů .NET a COM
Tato ukázka běží jenom na platformách Windows.
Existují softwarové komponenty s rozhraním .NET Framework a com, které umožňují provádět mnoho úloh správy systému. PowerShell umožňuje používat tyto komponenty, takže nejste omezeni na úlohy, které je možné provádět pomocí rutin. Mnoho rutin v počáteční verzi PowerShellu nefunguje se vzdálenými počítači. Ukážeme si, jak toto omezení obejít při správě protokolů událostí pomocí třídy .NET Framework System.Diagnostics.EventLog přímo z PowerShellu.
Použití nového objektu pro přístup k protokolu událostí
Knihovna tříd rozhraní .NET Framework obsahuje třídu s názvem System.Diagnostics.EventLog , kterou lze použít ke správě protokolů událostí. Novou instanci třídy rozhraní .NET Framework můžete vytvořit pomocí New-Object
rutiny s parametrem TypeName . Například následující příkaz vytvoří odkaz na protokol událostí:
New-Object -TypeName System.Diagnostics.EventLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
Přestože příkaz vytvořil instanci třídy EventLog , instance neobsahuje žádná data. je to proto, že jsme nezadali konkrétní protokol událostí. Jak získáte skutečný protokol událostí?
Použití konstruktorů s new-Object
Pokud chcete odkazovat na konkrétní protokol událostí, musíte zadat název protokolu. New-Object
má parametr ArgumentList. Argumenty, které předáte jako hodnoty tohoto parametru, se používají speciální spouštěcí metodou objektu. Metoda se nazývá konstruktor , protože se používá k vytvoření objektu. Pokud například chcete získat odkaz na protokol aplikace, zadáte řetězec Application jako argument:
New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
16,384 7 OverwriteOlder 2,160 Application
Poznámka:
Vzhledem k tomu, že většina tříd .NET je obsažena v systémovém oboru názvů, PowerShell se automaticky pokusí najít třídy, které zadáte v oboru názvů systému, pokud nemůže najít shodu pro zadaný název typu. To znamená, že místo Diagnostics.EventLog
System.Diagnostics.EventLog
.
Ukládání objektů v proměnných
Můžete chtít uložit odkaz na objekt, abyste ho mohli použít v aktuálním prostředí. I když PowerShell umožňuje pracovat s kanály hodně, snižuje potřebu proměnných, někdy ukládání odkazů na objekty v proměnných usnadňuje manipulaci s těmito objekty.
Výstup z libovolného platného příkazu PowerShellu lze uložit do proměnné. Názvy proměnných vždy začínají na $
. Pokud chcete uložit odkaz na aplikační protokol do proměnné s názvem $AppLog
, zadejte název proměnné, za kterou následuje rovnítko a potom zadejte příkaz použitý k vytvoření objektu protokolu aplikace:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Pokud pak zadáte $AppLog
, uvidíte, že obsahuje protokol aplikace:
$AppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
16,384 7 OverwriteOlder 2,160 Application
Přístup ke vzdálenému protokolu událostí pomocí new-object
Příkazy použité v předchozí části cílí na místní počítač; to Get-EventLog
může udělat rutina. Pokud chcete získat přístup k protokolu aplikace ve vzdáleném počítači, musíte jako argumenty zadat název protokolu i název počítače (nebo IP adresu).
$RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application, 192.168.1.81
$RemoteAppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
512 7 OverwriteOlder 262 Application
Když teď máme odkaz na protokol událostí uložený v $RemoteAppLog
proměnné, jaké úlohy s ní můžeme provádět?
Vymazání protokolu událostí pomocí metod objektů
Objekty často mají metody, které lze volat k provádění úloh. Můžete použít Get-Member
k zobrazení metod přidružených k objektu. Následující příkaz a vybraný výstup ukazují některé metody třídy EventLog :
$RemoteAppLog | Get-Member -MemberType Method
TypeName: System.Diagnostics.EventLog
Name MemberType Definition
---- ---------- ----------
...
Clear Method System.Void Clear()
Close Method System.Void Close()
...
GetType Method System.Type GetType()
...
ModifyOverflowPolicy Method System.Void ModifyOverflowPolicy(Overfl...
RegisterDisplayName Method System.Void RegisterDisplayName(String ...
...
ToString Method System.String ToString()
WriteEntry Method System.Void WriteEntry(String message),...
WriteEvent Method System.Void WriteEvent(EventInstance in...
Metodu Clear()
lze použít k vymazání protokolu událostí. Při volání metody je nutné vždy postupovat podle názvu metody závorky, i když metoda nevyžaduje argumenty. To umožňuje PowerShellu rozlišovat mezi metodou a potenciální vlastností se stejným názvem. Zadejte následující příkaz, který zavolá metodu Clear :
$RemoteAppLog.Clear()
$RemoteAppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
512 7 OverwriteOlder 0 Application
Všimněte si, že protokol událostí byl vymazán a nyní obsahuje 0 položek místo 262.
Vytváření objektů COM pomocí new-Object
Můžete použít New-Object
k práci s komponentami modelu COM (Component Object Model). Komponenty se liší od různých knihoven, které jsou součástí programu Windows Script Host (WSH), až po technologie ActiveX aplikace, jako je Internet Explorer, které jsou nainstalované ve většině systémů.
New-Object
používá k vytváření objektů MODELU COM obálky s voláním modulu runtime rozhraní .NET Framework, takže má stejná omezení jako rozhraní .NET Framework při volání objektů MODELU COM. Chcete-li vytvořit objekt COM, je nutné zadat ComObject parametr s Programmatic Identifier nebo ProgId třídy COM, kterou chcete použít. Úplná diskuze o omezeních použití modelu COM a určení dostupných identifikátorů ProgId v systému přesahuje rozsah příručky tohoto uživatele, ale většinu známých objektů z prostředí, jako je WSH, je možné použít v PowerShellu.
Objekty WSH můžete vytvořit zadáním těchtogid: WScript.Shell, WScript.Network, Scripting.Dictionary a Scripting.FileSystemObject. Následující příkazy vytvářejí tyto objekty:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
I když je většina funkcí těchto tříd k dispozici jinými způsoby v prostředí Windows PowerShell, několik úloh, jako je vytvoření zástupce, jsou stále jednodušší pomocí tříd WSH.
Vytvoření zástupce na ploše pomocí WScript.Shellu
Jedním z úkolů, které lze rychle provést pomocí objektu COM, je vytvoření zástupce. Předpokládejme, že chcete na ploše vytvořit zástupce, který odkazuje na domovskou složku powershellu. Nejprve musíte vytvořit odkaz na WScript.Shell, který uložíme do proměnné s názvem $WshShell
:
$WshShell = New-Object -ComObject WScript.Shell
Get-Member
funguje s objekty MODELU COM, abyste mohli prozkoumat členy objektu zadáním:
$WshShell | Get-Member
TypeName: System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}
Name MemberType Definition
---- ---------- ----------
AppActivate Method bool AppActivate (Variant, Va...
CreateShortcut Method IDispatch CreateShortcut (str...
...
Get-Member
má volitelný parametr InputObject , který můžete použít místo pipingu k zadání vstupu pro Get-Member
. Pokud byste místo toho použili příkaz Get-Member -InputObject $WshShell, získáte stejný výstup, jak je znázorněno výše. Pokud používáte InputObject, považuje argument za jedinou položku. To znamená, že pokud máte v proměnné několik objektů, Get-Member
považuje je za pole objektů. Příklad:
$a = 1,2,"three"
Get-Member -InputObject $a
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
Metoda WScript.Shell CreateShortcut přijímá jeden argument, cestu k souboru zástupce pro vytvoření. Mohli bychom zadat úplnou cestu k ploše, ale existuje jednodušší způsob. Plocha je obvykle reprezentována složkou s názvem Plocha uvnitř domovské složky aktuálního uživatele. Windows PowerShell má proměnnou $HOME
, která obsahuje cestu k této složce. Pomocí této proměnné můžeme zadat cestu k domovské složce a pak přidat název složky Plocha a název zástupce, který chcete vytvořit zadáním:
$lnk = $WshShell.CreateShortcut("$HOME\Desktop\PSHome.lnk")
Když použijete něco, co vypadá jako název proměnné uvnitř dvojitých uvozovek, PowerShell se pokusí nahradit odpovídající hodnotu. Pokud použijete jednoduché uvozovky, PowerShell se nepokouší nahradit hodnotu proměnné. Zkuste například zadat následující příkazy:
"$HOME\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
'$HOME\Desktop\PSHome.lnk'
$HOME\Desktop\PSHome.lnk
Teď máme proměnnou s názvem $lnk
, která obsahuje nový odkaz na zástupce. Pokud chcete zobrazit jeho členy, můžete ho přát Get-Member
na . Následující výstup ukazuje členy, které potřebujeme použít k dokončení vytváření zástupce:
$lnk | Get-Member
TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
Name MemberType Definition
---- ---------- ----------
...
Save Method void Save ()
...
TargetPath Property string TargetPath () {get} {set}
Potřebujeme zadat TargetPath, což je složka aplikace pro PowerShell, a pak zástupce uložit voláním Save
metody. Cesta ke složce aplikace PowerShellu je uložená v proměnné $PSHome
, takže to můžeme udělat zadáním:
$lnk.TargetPath = $PSHome
$lnk.Save()
Použití Internet Exploreru z PowerShellu
Mnoho aplikací, včetně systém Microsoft Office řady aplikací a Aplikace Internet Explorer, je možné automatizovat pomocí modelu COM. Následující příklady ilustrují některé typické techniky a problémy související s prací s aplikacemi založenými na modelu COM.
Instanci aplikace Internet Explorer vytvoříte zadáním Internet Exploreru ProgId, InternetExplorer.Application:
$ie = New-Object -ComObject InternetExplorer.Application
Tento příkaz spustí Internet Explorer, ale nezviditelní ho. Pokud zadáte Get-Process
, uvidíte, že je spuštěný proces iexplore
. Pokud ve skutečnosti ukončíte PowerShell, proces se bude dál spouštět. Chcete-li proces ukončit iexplore
, musíte počítač restartovat nebo použít nástroj, jako je Správce úloh.
Poznámka:
Objekty COM, které se spouští jako samostatné procesy, běžně označované jako technologie ActiveX spustitelné soubory, mohou nebo nemusí při spuštění zobrazit okno uživatelského rozhraní. Pokud vytvoří okno, ale nezobrazí ho, například Internet Explorer, fokus se obvykle přesune na plochu Windows. Aby bylo okno viditelné, musíte ho zviditelnit, aby s ním mohlo pracovat.
Zadáním $ie | Get-Member
můžete zobrazit vlastnosti a metody aplikace Internet Explorer. Pokud chcete zobrazit okno Internet Exploreru, nastavte vlastnost $true
Visible zadáním:
$ie.Visible = $true
Pak můžete pomocí Navigate
metody přejít na konkrétní webovou adresu:
$ie.Navigate("https://devblogs.microsoft.com/scripting/")
Pomocí jiných členů objektového modelu Aplikace Internet Explorer je možné načíst textový obsah z webové stránky. Následující příkaz zobrazí text HTML v textu aktuální webové stránky:
$ie.Document.Body.InnerText
Pokud chcete internet Explorer zavřít z PowerShellu, zavolejte jeho Quit()
metodu:
$ie.Quit()
Proměnná $ie
již neobsahuje platný odkaz, i když se stále zdá být objektem MODELU COM. Pokud se ho pokusíte použít, PowerShell vrátí chybu automatizace:
$ie | Get-Member
Get-Member : Exception retrieving the string representation for property "Appli
cation" : "The object invoked has disconnected from its clients. (Exception fro
m HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"
At line:1 char:16
+ $ie | Get-Member <<<<
Zbývající odkaz můžete odebrat příkazem, jako je $ie = $null
, nebo proměnnou úplně odebrat zadáním:
Remove-Variable ie
Poznámka:
Neexistuje žádný běžný standard pro to, jestli technologie ActiveX spustitelné soubory ukončí nebo se budou dál spouštět, když odeberete odkaz na jeden. V závislosti na okolnostech, jako je například to, jestli je aplikace viditelná, jestli je v něm spuštěný upravený dokument, a dokonce i to, jestli je PowerShell stále spuštěný, může nebo nemusí ukončit aplikaci. Z tohoto důvodu byste měli otestovat chování ukončení pro každý technologie ActiveX spustitelný soubor, který chcete použít v PowerShellu.
Zobrazení upozornění na objekty MODELU COM zabalené rozhraním .NET Framework
V některých případech může objekt COM mít přidruženou obálku rcW (Runtime-Callable Wrapper) rozhraní .NET Framework , kterou používá New-Object
. Vzhledem k tomu, že chování RCW se může lišit od chování normálního objektu COM, New-Object
má strict parametr, který vás upozorní na přístup RCW. Pokud zadáte strict parametr a pak vytvoříte objekt COM, který používá RCW, zobrazí se upozornění:
$xl = New-Object -ComObject Excel.Application -Strict
New-Object : The object written to the pipeline is an instance of the type "Mic
rosoft.Office.Interop.Excel.ApplicationClass" from the component's primary interop assembly. If
this type exposes different members than the IDispatch members , scripts written to work with this
object might not work if the primary interop assembly isn't installed. At line:1 char:17 + $xl =
New-Object <<<< -ComObject Excel.Application -Strict
I když je objekt stále vytvořený, zobrazí se upozornění, že se nejedná o standardní objekt MODELU COM.