Vytváření objektů .NET a COM (New-Object)

Existují softwarové komponenty s rozhraními .NET Framework a COM, které umožňují provádět mnoho úloh správy systému. Windows PowerShell umožňuje používat tyto komponenty, takže nejste omezeni na úlohy, které lze provádět pomocí rutin. Mnoho rutin v počáteční verzi Windows PowerShell nefunguje na vzdálených počítačích. 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 Windows PowerShell.

Použití New-Object 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í rutiny New-Object 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 tomuto parametru, jsou používány 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 aplikační protokol, jako argument zadáte řetězec Application:

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 základních tříd rozhraní .NET Framework je obsažena v systémovém oboru názvů, Windows PowerShell se automaticky pokusí najít třídy, které zadáte v oboru názvů system, pokud nemůže najít shodu pro zadaný název typu. To znamená, že místo System.Diagnostics.EventLog můžete zadat 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ž Windows PowerShell umožňuje provádět s kanály spoustu práce, 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.

Windows PowerShell umožňuje vytvářet proměnné, které jsou v podstatě pojmenovanými objekty. Výstup z libovolného platného příkazu Windows PowerShell lze uložit do proměnné. Názvy proměnných vždy začínají na $. Pokud chcete uložit odkaz na protokol aplikace do proměnné s názvem $AppLog, zadejte název proměnné následované symbolem rovná se 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č; Rutina Get-EventLog to dokáže. Pokud chcete získat přístup k aplikačnímu protokolu na 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 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 zobrazují 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...

K vymazání protokolu událostí lze použít metodu Clear(). Při volání metody musíte vždy sledovat název metody v závorkách, a to i v případě, že metoda nevyžaduje argumenty. To Windows PowerShell umožňuje rozlišovat mezi metodou a potenciální vlastností se stejným názvem. Zadejte následující příkaz pro volání metody Clear :

$RemoteAppLog.Clear()

Pokud chcete protokol zobrazit, zadejte následující příkaz. Uvidíte, že protokol událostí byl vymazán a teď má místo 262 položek 0:

$RemoteAppLog

```Output
  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder              0 Application

Vytváření objektů COM pomocí New-Object

Můžete použít New-Object k práci s komponentami modelu COM (Component Object Model). Komponenty zahrnují různé knihovny, které jsou součástí služby Windows Script Host (WSH), až po aplikace ActiveX, jako je Internet Explorer, které jsou nainstalovány ve většině systémů.

New-Object používá rozhraní .NET Framework Runtime-Callable Wrappers k vytváření objektů COM, takže má stejná omezení jako rozhraní .NET Framework při volání objektů COM. Chcete-li vytvořit objekt COM, je třeba 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 je nad rámec této uživatelské příručky, ale většinu známých objektů z prostředí, jako je WSH, lze použít v rámci Windows PowerShell.

Objekty WSH můžete vytvořit zadáním těchto parametrů: WScript.Shell, WScript.Network, Scripting.Dictionary a Scripting.FileSystemObject. Následující příkazy vytvoří 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 Windows PowerShell, několik úloh, jako je vytvoření zástupce, je 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 s objektem COM, je vytvoření zástupce. Předpokládejme, že chcete na ploše vytvořit zástupce, který odkazuje na domovskou složku pro Windows PowerShell. 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 pracuje s objekty COM, takže můžete 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 potrubí pro zadání vstupu do Get-Member. Pokud byste místo toho použili příkaz Get-Member -InputObject $WshShell, získáte stejný výstup jako na obrázku výše. Pokud použijete InputObject, zachází s jeho argumentem jako s jednou položkou. To znamená, že pokud máte v proměnné několik objektů, Get-Member zachází s nimi jako s polem objektů. Příklad:

$a = 1,2,"three"
Get-Member -InputObject $a
TypeName: System.Object[]
Name               MemberType    Definition
----               ----------    ----------
Count              AliasProperty Count = Length
...

WScript.Shell CreateShortcut Metoda přijímá jeden argument, cestu k souboru zástupce k 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 v domovské složce aktuálního uživatele. Windows PowerShell obsahuje 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 potom zadáním příkazu přidat název složky Plocha a název zástupce, který chcete vytvořit:

$lnk = $WshShell.CreateShortcut("$HOME\Desktop\PSHome.lnk")

Když v dvojitých uvozovkách použijete něco, co vypadá jako název proměnné, Windows PowerShell se pokusí nahradit odpovídající hodnotu. Pokud použijete jednoduché uvozovky, Windows PowerShell se nepokusí 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 nasměrovat na Get-Member. Následující výstup ukazuje členy, které musíme 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}

Musíme zadat TargetPath, což je složka aplikace pro Windows PowerShell, a poté uložit zástupce **$lnk** voláním Metody Save. Cesta ke složce aplikace Windows PowerShell je uložená v proměnné $PSHome, takže to můžeme udělat zadáním:

$lnk.TargetPath = $PSHome
$lnk.Save()

Používání Internet Exploreru z Windows PowerShell

Mnoho aplikací (včetně řady aplikací Microsoft Office a Internet Exploreru) lze automatizovat pomocí modelu COM. Internet Explorer znázorňuje některé typické techniky a problémy spojené s prací s aplikacemi založenými na modelu COM.

Instanci Internet Exploreru vytvoříte zadáním id 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 s názvem iexplore. Pokud Windows PowerShell ukončíte, proces bude ve skutečnosti pokračovat. Musíte restartovat počítač nebo použít nástroj, jako je Správce úloh ukončit proces iexplore.

Poznámka

Objekty COM, které se spouští jako samostatné procesy, běžně označované jako spustitelné soubory ActiveX, mohou nebo nemusí při spuštění zobrazit okno uživatelského rozhraní. Pokud vytvoří okno, ale nezviditelní ho, jako je Internet Explorer, fokus se obecně přesune na plochu Windows a vy musíte okno nastavit jako viditelné, abyste s ním mohli pracovat.

Zadáním příkazu $ie | Get-Membermůžete zobrazit vlastnosti a metody aplikace Internet Explorer. Pokud chcete zobrazit okno Internet Exploreru, nastavte vlastnost Visible na hodnotu $true zadáním:

$ie.Visible = $true

Pak můžete přejít na konkrétní webovou adresu pomocí metody Navigate:

$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()

To ho donutí zavřít. Proměnná $ie již neobsahuje platný odkaz, i když se stále zdá být objektem COM. Pokud se ho pokusíte použít, zobrazí se chyba 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 buď odebrat příkazem $ie = $null, nebo úplně odebrat proměnnou zadáním:

Remove-Variable ie

Poznámka

Neexistuje žádný běžný standard pro to, zda se spustitelné soubory ActiveX ukončí nebo budou nadále spouštět, když odeberete odkaz na některou z nich. V závislosti na okolnostech, jako je například to, zda je aplikace viditelná, zda je v ní spuštěný upravený dokument, a dokonce i to, zda je Windows PowerShell stále spuštěna, aplikace může nebo nemusí být ukončena. Z tohoto důvodu byste měli otestovat chování ukončení pro každý spustitelný soubor ActiveX, který chcete použít v Windows PowerShell.

Zobrazení upozornění o objektech .NET Framework-Wrapped COM

V některých případech může mít objekt COM přidruženou obálku volatelnou runtime rozhraní .NET Framework nebo RCW, kterou bude používat New-Object. Vzhledem k tomu, že chování RCW se může lišit od chování normálního objektu COM, New-Objectstrict parametr upozorňovat na přístup RCW. Pokud zadáte parametr Strict a pak vytvoříte objekt COM, který používá RCW, zobrazí se zpráva 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 inte rop assembly. If
this type exposes different members than the IDispatch members , scripts written to work with this
object might not work if the primary intero p assembly is not 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 COM.