Skapa .NET- och COM-objekt (New-Object)
Det finns programvarukomponenter med .NET Framework- och COM-gränssnitt som gör att du kan utföra många systemadministrationsuppgifter. Windows PowerShell kan du använda dessa komponenter, så du är inte begränsad till de uppgifter som kan utföras med hjälp av cmdlets. Många av cmdletarna i den första versionen Windows PowerShell fungerar inte mot fjärrdatorer. Vi visar hur du kommer runt den här begränsningen när du hanterar händelseloggar med hjälp av klassen .NET Framework System.Diagnostics.EventLog direkt från Windows PowerShell.
Använda New-Object för händelseloggåtkomst
I .NET Framework klassbiblioteket finns en klass med namnet System.Diagnostics.EventLog som kan användas för att hantera händelseloggar. Du kan skapa en ny instans av en .NET Framework med hjälp av New-Object cmdleten med parametern TypeName. Följande kommando skapar till exempel en händelseloggreferens:
New-Object -TypeName System.Diagnostics.EventLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
Även om kommandot har skapat en instans av klassen EventLog innehåller instansen inga data. Det beror på att vi inte angav en viss händelselogg. Hur får du en verklig händelselogg?
Använda konstruktorer med New-Object
Om du vill referera till en specifik händelselogg måste du ange namnet på loggen. New-Objecthar en ArgumentList-parameter. Argumenten som du skickar som värden till den här parametern används av en särskild startmetod för -objektet. Metoden kallas för en konstruktor eftersom den används för att konstruera objektet. Om du till exempel vill hämta en referens till programloggen anger du strängen "Application" som ett argument:
New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
16,384 7 OverwriteOlder 2,160 Application
Anteckning
Eftersom de flesta .NET Framework kärnklasser finns i systemnamnrymden försöker Windows PowerShell automatiskt hitta klasser som du anger i namnområdet System om det inte går att hitta någon matchning för det typnamn som du anger. Det innebär att du kan ange Diagnostics.EventLog i stället för System.Diagnostics.EventLog.
Lagra objekt i variabler
Du kanske vill lagra en referens till ett objekt så att du kan använda den i det aktuella gränssnittet. Även Windows PowerShell kan du göra mycket arbete med pipelines, minska behovet av variabler, och ibland lagra referenser till objekt i variabler gör det enklare att manipulera dessa objekt.
Windows PowerShell kan du skapa variabler som i stort sett är namngivna objekt. Utdata från ett giltigt Windows PowerShell kommando kan lagras i en variabel. Variabelnamn börjar alltid med $ .
Om du vill lagra programloggreferensen i en variabel med namnet $AppLog skriver du namnet på variabeln följt av ett likhetstecken och skriver sedan kommandot som används för att skapa programloggobjektet:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Om du sedan $AppLog kan du se att den innehåller programloggen:
$AppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
16,384 7 OverwriteOlder 2,160 Application
Åtkomst till en fjärrhändelselogg med New-Object
Kommandona som används i föregående avsnitt är mål för den lokala datorn. Get-EventLog cmdleten kan göra det. Om du vill komma åt programloggen på en fjärrdator måste du ange både loggnamnet och ett datornamn (eller en IP-adress) som argument.
$RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application,192.168.1.81
$RemoteAppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
512 7 OverwriteOlder 262 Application
Nu när vi har en referens till en händelselogg som lagras i $RemoteAppLog variabeln, vilka uppgifter kan vi utföra på den?
Rensa en händelselogg med objektmetoder
Objekt har ofta metoder som kan anropas för att utföra uppgifter. Du kan använda Get-Member för att visa de metoder som är associerade med ett objekt. Följande kommando och valda utdata visar några metoder för klassen 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...
Metoden Clear()kan användas för att rensa händelseloggen. När du anropar en metod måste du alltid följa metodnamnet med parenteser, även om metoden inte kräver argument. På så Windows PowerShell skilja mellan metoden och en potentiell egenskap med samma namn. Skriv följande för att anropa Clear-metoden:
$RemoteAppLog.Clear()
Skriv följande för att visa loggen. Du ser att händelseloggen har rensats och nu har 0 poster i stället för 262:
$RemoteAppLog
```Output
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
512 7 OverwriteOlder 0 Application
Skapa COM-objekt med New-Object
Du kan använda New-Object för att arbeta med Component Object Model (COM)-komponenter. Komponenter sträcker sig från de olika biblioteken som ingår i Windows Script Host (WSH) till ActiveX program, till exempel Internet Explorer som är installerade på de flesta system.
New-Objectanvänder .NET Framework Runtime-Callable för att skapa COM-objekt, så den har samma begränsningar som .NET Framework när du anropar COM-objekt. Om du vill skapa ett COM-objekt måste du ange parametern ComObject med programmatisk identifierare eller ProgId för den COM-klass som du vill använda. En fullständig diskussion om begränsningarna för COM-användning och att avgöra vilka ProgIds som är tillgängliga i ett system ligger utanför omfånget för den här användarhandboken, men de flesta välkända objekt från miljöer som WSH kan användas i Windows PowerShell.
Du kan skapa WSH-objekten genom att ange följande objekt: WScript.Shell, WScript.Network, Scripting.Dictionary och Scripting.FileSystemObject. Följande kommandon skapar dessa objekt:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Även om de flesta av funktionerna i de här klasserna görs tillgängliga på andra sätt i Windows PowerShell, är några uppgifter som att skapa genväg fortfarande enklare att göra med hjälp av WSH-klasserna.
Skapa en skrivbordsgenväg med WScript.Shell
En uppgift som kan utföras snabbt med ett COM-objekt är att skapa en genväg. Anta att du vill skapa en genväg på skrivbordet som länkar till startmappen för Windows PowerShell. Du måste först skapa en referens till WScript.Shell, som vi lagrar i en variabel med namnet $WshShell:
$WshShell = New-Object -ComObject WScript.Shell
Get-Member fungerar med COM-objekt, så du kan utforska medlemmarna i objektet genom att skriva:
$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 har en valfri InputObject-parameter som du kan använda i stället för piping för att ange indata till Get-Member . Du får samma utdata som visas ovan om du i stället använder kommandot Get-Member -InputObject $WshShell. Om du använder InputObject behandlas dess argument som ett enskilt objekt. Det innebär att om du har flera objekt i en variabel, Get-Member behandlar dem som en matris med objekt. Ett exempel:
$a = 1,2,"three"
Get-Member -InputObject $a
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
Metoden WScript.Shell CreateShortcut accepterar ett enda argument, sökvägen till genvägsfilen som ska skapas. Vi kan skriva in den fullständiga sökvägen till skrivbordet, men det finns ett enklare sätt. Skrivbordet representeras vanligtvis av en mapp med namnet Desktop i den aktuella användarens startmapp. Windows PowerShell har en variabel $Home som innehåller sökvägen till den här mappen. Vi kan ange sökvägen till startmappen med hjälp av den här variabeln och sedan lägga till namnet på mappen Desktop och namnet på genvägen som ska skapas genom att skriva:
$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")
När du använder något som ser ut som ett variabelnamn inom dubbla citattecken försöker Windows PowerShell ersätta ett matchande värde. Om du använder enkla citattecken Windows PowerShell inte ersätta variabelvärdet. Prova till exempel att skriva följande kommandon:
"$Home\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
'$Home\Desktop\PSHome.lnk'
$Home\Desktop\PSHome.lnk
Nu har vi en variabel med namnet $lnk som innehåller en ny genvägsreferens. Om du vill se dess medlemmar kan du skicka dem till Get-Member . Utdata nedan visar de medlemmar som vi behöver använda för att slutföra skapandet av genvägen:
$lnk | Get-Member
TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
Name MemberType Definition
---- ---------- ----------
...
Save Method void Save ()
...
TargetPath Property string TargetPath () {get} {set}
Vi måste ange TargetPath, som är programmappen för Windows PowerShell och sedan spara genvägen $lnk genom att ** anropa ** metoden Spara. Den Windows PowerShell sökvägen till programmappen lagras i $PSHome variabeln , så vi kan göra detta genom att skriva:
$lnk.TargetPath = $PSHome
$lnk.Save()
Använda Internet Explorer från Windows PowerShell
Många program (inklusive Microsoft Office program och Internet Explorer) kan automatiseras med hjälp av COM. Internet Explorer några av de vanliga tekniker och problem som är inblandade i arbetet med COM-baserade program.
Du skapar en Internet Explorer-instans genom att ange Internet Explorer ProgId, InternetExplorer.Application:
$ie = New-Object -ComObject InternetExplorer.Application
Det här kommandot Internet Explorer, men gör det inte synligt. Om du skriver Get-Process ser du att en process med namnet iexplore körs. Om du avslutar en Windows PowerShell fortsätter processen att köras. Du måste starta om datorn eller använda ett verktyg som Aktivitetshanteraren för att avsluta iexplore-processen.
Anteckning
COM-objekt som startar som separata processer, som ofta ActiveX körbara filer, kanske eller kanske inte visar ett användargränssnittsfönster när de startas. Om de skapar ett fönster men inte gör det synligt, till exempel Internet Explorer, flyttas fokus vanligtvis till Windows-skrivbordet och du måste göra fönstret synligt för att interagera med det.
Genom att $ie | Get-Member skriva kan du visa egenskaper och metoder för Internet Explorer. Om du vill Internet Explorer fönstret anger du visible-egenskapen till $true genom att skriva:
$ie.Visible = $true
Du kan sedan navigera till en specifik webbadress med hjälp av metoden Navigera:
$ie.Navigate("https://devblogs.microsoft.com/scripting/")
Med andra medlemmar i Internet Explorer-objektmodellen är det möjligt att hämta textinnehåll från webbsidan. Följande kommando visar HTML-texten i brödtexten på den aktuella webbsidan:
$ie.Document.Body.InnerText
Om du Internet Explorer inifrån PowerShell anropar du dess Quit() -metod:
$ie.Quit()
Detta tvingar den att stänga. Variabeln $ie innehåller inte längre en giltig referens även om den fortfarande verkar vara ett COM-objekt. Om du försöker använda det får du ett automationsfel:
$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 <<<<
Du kan antingen ta bort den återstående referensen med ett kommando som $ie = $null, eller helt ta bort variabeln genom att skriva:
Remove-Variable ie
Anteckning
Det finns ingen gemensam standard för om ActiveX körbara filer avslutas eller fortsätter att köras när du tar bort en referens till en. Beroende på omständigheter, till exempel om programmet är synligt, om ett redigerat dokument körs i det och även om Windows PowerShell fortfarande körs, kan programmet avslutas eller inte. Därför bör du testa avslutningsbeteendet för varje körbar ActiveX som du vill använda i Windows PowerShell.
Få varningar om .NET-Framework-Wrapped COM-objekt
I vissa fall kan ett COM-objekt ha en associerad .NET Framework Runtime-Callable Wrapper eller RCW, och detta används av New-Object . Eftersom RCW-beteendet kan vara annorlunda än det normala COM-objektet har du parametern Strikt som varnar New-Object dig om RCW-åtkomst. Om du anger parametern Strikt och sedan skapar ett COM-objekt som använder en RCW visas ett varningsmeddelande:
$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
Även om objektet fortfarande skapas får du en varning om att det inte är ett com-standardobjekt.