Changes

Jump to: navigation, search

An Overview of Windows PowerShell 1.0 and .NET

11,421 bytes added, 18:53, 9 December 2008
New page: The power of Windows PowerShell is enhanced significantly by the ability to access and utilize the .NET framework from within both the shell environment and PowerShell scripts. This means ...
The power of Windows PowerShell is enhanced significantly by the ability to access and utilize the .NET framework from within both the shell environment and PowerShell scripts. This means that if there is a requirement for which a Windows PowerShell cmdlet or construct is not available, there is a very good chance the behavior is available via .NET. For example, Windows PowerShell is a text based environment with no built in support for creating and displaying graphical user interfaces (GUIs). Through the use of .NET WinForms support, however, even the most complex of GUIs can be created quickly and easily from with Windows PowerShell.

In this chapter of [[Windows PowerShell 1.0 Essentials]] the basics of using .NET within Windows PowerShell will be covered. In the next chapter, [[Designing GUIs in Windows PowerShell 1.0 with WinForms]], will cover creation of graphical user interfaces.

== The Basics of .NET ==

.NET is a vast framework of libraries (also referred to as ''assemblies'') which provide application programming interfaces (APIs) designed to perform a wide range of application functions. For example, assemblies are provided specifically for graphical user interface creation, web application development, business process handling and database access (to name just a few). Microsoft has invested significant research and development into developing .NET to the extent that it is now one of the most comprehensive development frameworks available today.

Factor into this the fact that much of the power of .NET is available from within Windows PowerShell and the significance of this relationship quickly becomes evident.

== Exploring .NET Assemblies in Windows PowerShell ==

As previously mentioned, the .NET functionality is provided via a collection of ''assemblies''. These are essentially dynamic link libraries packaged into Windows ''.dll'' files. The majority of .NET assemblies are not loaded into Windows PowerShell by default, and must therefore, be loaded prior to being used. There are, however, a number of assemblies which are pre-loaded by default when Windows PowerShell is invoked. A full list of the currently loaded assemblies can be obtained using the following command:

<pre>
PS C:\> [AppDomain]::CurrentDomain.GetAssemblies() | fl
</pre>

The above command will output detailed information about each currently loaded .NET assembly. One such entry might appear as follows:

<pre>
CodeBase : file:///C:/Windows/assembly/GAC_MSIL/System.Configuration.Install/2.0.0.0_
_b03f5f7f11d50a3a/System.Configuration.Install.dll
EntryPoint :
EscapedCodeBase : file:///C:/Windows/assembly/GAC_MSIL/System.Configuration.Install/2.0.0.0_
_b03f5f7f11d50a3a/System.Configuration.Install.dll
FullName : System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyT
oken=b03f5f7f11d50a3a
GlobalAssemblyCache : True
HostContext : 0
ImageFileMachine :
ImageRuntimeVersion : v2.0.50727
Location : C:\Windows\assembly\GAC_MSIL\System.Configuration.Install\2.0.0.0__b03f5f7
f11d50a3a\System.Configuration.Install.dll
ManifestModule : System.Configuration.Install.dll
MetadataToken :
PortableExecutableKind :
ReflectionOnly : False
</pre>

Specific values may be extracted using the ''select-object'' cmdlet. For example, to list just the FullName field:

<pre>
PS C:\> [AppDomain]::CurrentDomain.GetAssemblies() | select-object FullName

FullName
--------
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Microsoft.PowerShell.ConsoleHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Management.Automation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.PowerShell.Commands.Management, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3...
Microsoft.PowerShell.Security, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.Commands.Utility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856...
System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
</pre>

== Loading .NET Assemblies into Windows PowerShell ==

If .NET functionality is required from an assembly which is not loaded by default when Windows PowerShell is invoked, it must first be loaded manually before it can be used. This is achieved using the ''LoadWithPartialName'' static method of the ''[System.Reflection.Assembly]'' class. For example, to load the WinForms assembly to create GUI based applications:

<pre>
PS C:\> [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

GAC Version Location
--- ------- --------
True v2.0.50727 C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e08...
</pre>

Once loaded, the assembly may be called upon to perform tasks from within Windows PowerShell.

== .NET Static Members and Properties ==

Static methods and properties may be accessed without created instances of the class in question. The syntax for accessing a static method is as follows:

[Classname]::Method(parameters)

For example, the following invokes the ''Get_BackgroundColor()'' static method of the ''[System.Console]'' class:

<pre>
PS C:\> [System.Console]::get_backgroundcolor()
DarkMagenta
</pre>

Alternatively, the ''Set_BackgroundColor()'' method may be invoked to switch the background of the console to a different color:

<pre>
PS C:\> [System.Console]::Set_backgroundcolor("red")
</pre>

Similarly the static ''properties'' of a class may be accessed using the following syntax:

[Classname]::Property

In the following example, the above syntax is used to extract today's date from the ''[System.DateTime]'' class:

<pre>
PS C:\> [System.DateTime]::Today

Tuesday, December 09, 2008 12:00:00 AM
</pre>

It is not typically possible to set the value of a static property.

== Instance Members and Properties ==

In the case of instance members, an instance of the class must first be created before the methods and properties of that class may be used from within PowerShell. The syntax for creating an instance of a class (also referred to as an ''object'') requires the use of the ''new-object'' cmdlet and is as follows:

''$object'' = new-object ''classname''(''parameters'')

Once an instance has been created, methods may be accessed using the following syntax:

$object.MethodName(Parameters)

Similarly, instance properties may be accessed and set as follows:

$object.PropertyName

$object.NropertyName = new_value

For example, to create an instance of the ''[System.Net.WebClient]'' class, and then call an instance method on that object:

<pre>
PS C:\> $webobject = new-object System.Net.WebClient
PS C:\> $webobject.downloadstring("http://www.techotopia.com")
</pre>

== Listing the Methods and Properties of a .NET Class ==

The .NET Framework is a vast collection of classes, methods and properties. As such there many resources both in print and on-line providing detailed .NET reference information. If all that is required, however, is a listing of the methods and properties available in a .NET class, this can be obtained from within the Windows PowerShell environment using the ''get-members'' cmdlet.

To obtain a list of all instance methods and properties of a particular class, simply pipe it through to the ''get-members'' cmdlet as illustrated below:

<pre>
PS C:\> [System.DateTime] | get-member


TypeName: System.RuntimeType

Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone()
Equals Method System.Boolean Equals(Object obj), System.Boolean Equa...
FindInterfaces Method System.Type[] FindInterfaces(TypeFilter filter, Object...
FindMembers Method System.Reflection.MemberInfo[] FindMembers(MemberTypes...
GetArrayRank Method System.Int32 GetArrayRank()
GetConstructor Method System.Reflection.ConstructorInfo GetConstructor(Bindi...
GetConstructors Method System.Reflection.ConstructorInfo[] GetConstructors(Bi...
GetCustomAttributes Method System.Object[] GetCustomAttributes(Boolean inherit), ...
GetDefaultMembers Method System.Reflection.MemberInfo[] GetDefaultMembers()
.
.
.
Assembly Property System.Reflection.Assembly Assembly {get;}
AssemblyQualifiedName Property System.String AssemblyQualifiedName {get;}
Attributes Property System.Reflection.TypeAttributes Attributes {get;}
BaseType Property System.Type BaseType {get;}
ContainsGenericParameters Property System.Boolean ContainsGenericParameters {get;}
DeclaringMethod Property System.Reflection.MethodBase DeclaringMethod {get;}
DeclaringType Property System.Type DeclaringType {get;}
FullName Property System.String FullName {get;}
GenericParameterAttributes Property System.Reflection.GenericParameterAttributes GenericPa...
GenericParameterPosition Property System.Int32 GenericParameterPosition {get;}
.
.
.
</pre>

Similarly, a listing of the static methods and properties of a .NET class may be obtained using the ''-static'' option of the ''get-members'' cmdlet:

<pre>
PS C:\> [System.DateTime] | get-member -static


TypeName: System.DateTime

Name MemberType Definition
---- ---------- ----------
Compare Method static System.Int32 Compare(DateTime t1, DateTime t2)
DaysInMonth Method static System.Int32 DaysInMonth(Int32 year, Int32 month)
Equals Method static System.Boolean Equals(DateTime t1, DateTime t2), static ...
FromBinary Method static System.DateTime FromBinary(Int64 dateData)
FromFileTime Method static System.DateTime FromFileTime(Int64 fileTime)
FromFileTimeUtc Method static System.DateTime FromFileTimeUtc(Int64 fileTime)
FromOADate Method static System.DateTime FromOADate(Double d)
get_Now Method static System.DateTime get_Now()
get_Today Method static System.DateTime get_Today()
get_UtcNow Method static System.DateTime get_UtcNow()
IsLeapYear Method static System.Boolean IsLeapYear(Int32 year)
.
.
.
MaxValue Property static System.DateTime MaxValue {get;set;}
MinValue Property static System.DateTime MinValue {get;set;}
Now Property System.DateTime Now {get;}
Today Property System.DateTime Today {get;}
UtcNow Property System.DateTime UtcNow {get;}
</pre>

Navigation menu