Windows PowerShell Script Examples

Probably everyone has heard about PowerShell, but most likely not everyone had a chance to work with it. For those who are just starting to pave their way into the jungle of PowerShell, we present the translation of a post published on the 4sysops.com portal. It provides 7 commands to help those new to PowerShell. For details - welcome under cat.

GET-HELP

The very first and most important PowerShell cmdlet is the Help call. You can use the Get-Help cmdlet to check the syntax, see usage examples, and see detailed descriptions of the parameters for any PowerShell cmdlet. What's interesting about this cmdlet is that you can simply type Get-Help Services to get a list of all cmdlets that are suitable for working with services.
Example:
PS C: \\\u003e Get-Help Service

You can select any cmdlet from the list above for help with it. For instance,
PS C: \\\u003e Get-Help -Name Get-Service
You get all the information about the Get-Service cmdlet (discussed below).


GET-CONTENT

Reading the contents of files is the most common requirement for newbies trying to learn PowerShell. Reading files with PowerShell is simplified. Even a layman can read the contents of a file simply by passing it to the Get-Content cmdlet.
Example.
PS C: \\\u003e Get-Content C: \\ scripts \\ Computers.txt mytestpc1 techibee.com dummynotresolvinghost.com PS C: \\\u003e

Need more information about a cmdlet? Use Get-Help:
PS C: \\\u003e Get-Help Get-Content -Detailed

GET-SERVICE

This cmdlet lists all the services installed on the computer. You can use it to get information about a specific service, a collection of services, or simply all the services on a computer.
Example:
PS C: \\\u003e Get-Service wwansvc, spooler Status Name DisplayName ------ ---- ----------- Running spooler Print Spooler Stopped wwansvc WWAN AutoConfig PS C: \\\u003e



Here we have requested information about two services wwansvc and spooler
A table with the status of the service, its name and display name is displayed.
We can see that the spooler service is started and wwansvc is stopped

STOP-SERVICE AND START-SERVICE

Starting and stopping services is quite an important point in work windows administrator... PowerShell has built-in cmdlets that make it easy for an administrator to work without having to open mMC console... Using these cmdlets you can stop / start services on both local and remote computers.
Examples:
Start / stop service on local computer (using the example of the spooler service):
PS C: \\\u003e Stop-Service -Name Spooler PS C: \\\u003e Start-Service -Name Spooler

Start / stop service on remote computer (spooler):
PS C: \\\u003e $ ServiceObj \u003d Get-Service -ComputerName MyPC1 -Name spooler PS C: \\\u003e Stop-Service -InputObj $ ServiceObj PS C: \\\u003e Start-Service -InputObj $ ServiceObj

GET-PROCESS

This cmdlet lets you know what processes are running on local or remote computers. The name and ID of the process are shown, as well as the path to the executable file, company name, version of the executable file, and memory used by the process.
Examples:
Getting information about the processes running on the local computer:

PS C: \\\u003e Get-Process


Enter the following cmdlet to get detailed information about running processes
PS C: \\\u003e Get-Process | Format-List * -Force

Obtaining information about processes running on a remote computer:
PS C: \\\u003e Get-Process -ComputerName MYPC1 | Format-List * -Force

MYPC1 must be replaced with the name of the computer from which you want to get information about running processes.

STOP-PROCESS

This cmdlet stops a process on a local or remote computer. It takes the name or ID of the process and ends the process. This is useful in cases where the application is not responding.
Example:
Stop process with ID 22608 on the local computer:
PS C: \\\u003e Stop-Process -Id 22608
Stop all Excel processes on the local computer:
PS C: \\\u003e Stop-Process -name excel

Advice: Although the Stop-Process cmdlet does not have the -ComputerName parameter, you can still use it to terminate remote processes using the advice below:
PS C: \\\u003e $ Obj \u003d Get-Process -Name excel -ComputerName MYPC1 PS C: \\\u003e Stop-Process -InputObject $ Obj

Upd:
The post contains a translation of the article from the portal

There is always room for creativity in administration. Do you want to do some kind of automation routine tasks? You are welcome! Need something to regularly check for activity? No problem! Do you want to process some giant report and display only relevant data? You can too. All of these tasks and more are best accomplished with scripts, and PowerShell is the best choice for Windows.

What is PowerShell and why it is good

Users of UNIX and Linux, and at some point and macOS are used to the fact that you always have Bash at hand - a little old-fashioned, but versatile and powerful tool with which you can do amazing things in just a couple of lines. You write a new script in cron - and you're done, it is already running on your computer or on the server and quietly does something useful.

Returning to Windows (and sometimes there is nothing without it), you understand that, although .bat scripts are good, they do not always save: their capabilities are very limited. And if you still thought that PowerShell is an unknown contraption, for the sake of which you need to raise and configure something, then do not rush to conclusions - if you look at it, it is not bad at all.

Windows PowerShell is an extensible open source automation tool that consists of a shell (command line) and a scripting language. It was first shown in 2003 (then called Monad). PowerShell 2.0 was released with Windows 7 and Windows Server 2008 R2 and has been present in Windows as a standard feature ever since. It was even included in Windows XP SP3. PowerShell is built on and integrated with the .NET Framework. PowerShell can access COM, WMI, and ADSI, and of course, it also executes console commands.

In general, "poschik" has strong ties with Microsoft products, be it Active Directory or mail server Exchange. This allows you to access them through the console and issue commands without connecting to the server snap-in.

If you weren't interested in PowerShell before, then most likely you have the second version. I recommend upgrading to at least the third one - it contains much more features and useful chips... If you do not go into details, then in PowerShell 2.0 there are about a dozen modules and about 350 commands, and in PowerShell 3.0 there are already about 2300 cmdlets from more than 70 modules. The Hacker also wrote about how the newest PowerShell version 5 of Windows 10 is different.

Choosing a development environment and tools

Now let's figure out where it is most convenient to write code. You can, of course, also in Notepad, Notepad ++ or Sublime. But in this case, this is not the most competent choice of the editor. The best way to get started with PowerShell is with the bundled one.



It is not even an editor, but an almost complete development environment. There is an IntelliSense feature that lets you view a list of cmdlets and their parameters, variables, utilities, and more. Snippets are supported, it is possible to expand the set of functions due to various add-ons. The Commands window is also very useful. In it, you can compose commands in visual mode: you select a module, find the required cmdlet and set the necessary parameters for it. The resulting command can be copied to the console or immediately run for execution. In general, a kind of constructor for the admin. And of course, there is syntax highlighting, debugger and much more.

However, PowerShell ISE has some worthy competitors. One of them - .

PowerGUI is a visual addition to PowerShell. It makes it easy to build your own scripts before choosing the required cmdlets. You take what you need to solve a problem and drag and drop pieces of code until you get the script. One of the main features of PowerGUI is Power Packs, ready-made scripts published by the user community and laid out for free access. There are simple commands like adding users and complex ones like managing switches and virtual machines. All of them are easy to supplement and modify according to the needs.



Sapien firms are a more advanced environment that is designed for the joint development of one project by a large number of participants. If you've ever dealt with Visual Studio, then I think you'll notice the similarities. PowerShell Studio's useful features include a Ribbon bar, remote debugging support, and compiler functions that allow you to include scripts in executables. There is support different versions PowerShell.



Script Browser for Windows PowerShell ISE is also worth mentioning. It is not a development environment, but a very interesting tool developed by Microsoft. Script Browser provides access to a database of ready-made scripts that you can use as samples for writing your own code. And this thing can also analyze the code you write and suggest how to improve it.



Several useful tricks

Having dealt with the editor, you can start writing code. PowerShell is not a complicated language, and I think you can quickly figure out what's what. The commands are referred to here as cmdlets, and each has two parts. First comes the action, for example Get, Set, Add, Invoke, Remove. Then the action is directed to: Service, VM, AzureAccount, DHCPServerSetting. Each part is separated from the other by a hyphen. It turns out, for example, get-process. This, by the way, helpful commandwhich lists the processes. Let's say if you write

get - process BadTh *

we will see something like this:

Handles NPM (K) PM (K) WS (K) VM (M) CPU (s) Id ProcessName

------------------------

28 4 - 210844 - 201128 - 163 25.67 2792 BadThread

Now you can end the hung process:

You can view it recursively, though with a little more complex logic:

You can also do

By the way, for each field in the option box account or computer can be accessed and read the data. This way you can make whole slices. For example, here's a query based on phone numbers:

Get - AdUser - Filter * - Properties OfficePhone | FT OfficePhone, UserPrincipalName

PowerShell vs. bat

Sometimes the problem can be solved both by the old old-fashioned method and by powerShell help... I recommend not to be lazy and use PS, if only simply because this way you will learn it faster and will be able to apply it in more complex situations. In addition, you will gradually appreciate its syntax - more elegant and consistent. Here are a few examples of how things have been done before and how they can be done using PowerShell.

You can manage SQL Server Extended Events by using the SQL Server PowerShell Provider. The XEvent subfolder is located on the SQLSERVER drive. You can access the folder in one of the following ways.

In the XEvent folder tree, you can view existing extended event sessions and their associated events, targets, and predicates. For example, in the PS SQLSERVER: \\ XEvent \\ ServerName \\ InstanceName\u003e folder, if you type cd sessions, press Enter, type dir, and then press Enter, you can view a list of sessions stored in that instance. You can also check if the session is currently running (and if so, for how long), and whether the session is set to start when the instance is started.

To view the events, their predicates, and targets associated with a session, you can change the directory names to the session name and then view either the events folder or the targets folder. For example, to view the events and their predicates associated with the default system health monitoring session, in the PS SQLSERVER: \\ XEvent \\ ServerName \\ InstanceName \\ Sessions\u003e folder, type cd system_health \\ events, press ENTER, type dir, and then press ENTER ...

The SQL Server PowerShell Provider provides a rich set of functionality for creating, modifying, and managing extended event sessions. The following section lists some simple examples using PowerShell scripts with extended events.

    The scripts must be run from the PS SQLSERVER: \\\u003e location (enter in command line sqlps).

    The scripts use the default SQL Server instance.

    Scripts must be saved with the PS1 extension.

    Politics powerShell execution should allow execution of scripts. To set the execution policy, use the cmdlet Set-Executionpolicy. (For getting additional information enter get-help set-executionpolicy -detailed and press Enter.)

The following script creates a new session named "TestSession".

#Script for creating a session. cd XEvent $ h \u003d hostname cd $ h #Use the default instance. $ store \u003d dir | where ($ _. DisplayName -ieq "default") $ session \u003d new-object Microsoft.SqlServer.Management.XEvent.Session -argumentlist $ store, "TestSession" $ event \u003d $ session.AddEvent ("sqlserver.file_written") $ event.AddAction ("package0.callstack") $ session.Create ()

The following script adds the Ring Buffer target to the session created in the previous example. (This example demonstrates the use of the method Alter. Remember, you can add a goal only after creating a session.) #Script for creating a session. cd XEvent $ h \u003d hostname cd $ h #Use the default instance. $ store \u003d dir | where ($ _. DisplayName -ieq "default") $ session \u003d new-object Microsoft.SqlServer.Management.XEvent.Session -argumentlist $ store, "TestSession2" $ event \u003d $ session.AddEvent ("sqlserver.file_written") # Construct a predicate "equal_i_unicode_string (path, N" c: \\ temp.log ")". $ column \u003d $ store.SqlServerPackage.EventInfoSet ["file_written"]. DataEventColumnInfoSet ["path"] $ operand \u003d new-object Microsoft.SqlServer.Management.XEvent.PredOperand -argumentlist $ column $ value \u003d new-object Microsoft.SqlServer. Management.XEvent.PredValue -argumentlist "c: \\ temp.log" $ compare \u003d $ store.Package0Package.PredCompareInfoSet ["equal_i_unicode_string"] $ predicate \u003d new-object Microsoft.SqlServer.Management.XEvent.PredFunctionExpr -argumentlist $ compare operand, $ value $ event.SetPredicate ($ predicate) $ session.Create ()

Our review is dedicated to using key opportunities Windows PowerShell for performing various administrative tasks. First, let's look at the built-in familiarization with Windows PowerShell capabilities.

Introducing Windows PowerShell Features

So, you're an administrator who needs to get up to speed with Windows PowerShell in no time. The first thing you will probably do (naturally, besides referring to the documentation and help system), - use the Help command (Fig. 1).

By taking a close look at the information displayed on the screen, we come to understand the following conceptual things: There are aliases, cmdlets, providers, and help files in Windows PowerShell. Aliases are used to simplify command entry (for example, clc - this is the alias of the command Clear-Content), cmdlets (cmdlets) are the implementation of all the built-in Windows PowerShell commands, providers (providers) provide access to the file system, registry, certificate store, etc., and help files (helpfile) are used to get additional information... For getting detailed description command, the following syntax applies:

PS C:\u003e Help Get-Command

As a result of executing this command, we get full description commands Get-Command, including its purpose, syntax, options, etc. (fig. 2).


To get a list of all built-in commands, use the following syntax:

PS C:\u003e Get-Command

Please note that all commands are composed of a verb and an adjective (for example, Get-Content, Export-Console) and all teams support unified system naming - for example, the verb Stop is always used to complete something, and not Kill, Terminate, Halt or other synonyms, which greatly simplifies the study powerShell features (fig. 3).


Command Get-Service serves to get a list of all services running on this computer... For instance,

PS C:\u003e Get-Service

returns the list shown in Fig. 4.


To get a list of processes running in this moment on the computer, the command is applied Get-Process (fig. 5):


PS C:\u003e Get-Process

Windows PowerShell supports automatic completion input. To verify this, enter Get-P and press the TAB key: you will be able to select all commands that start with the entered characters.

To get information about only one process as a command argument Get-Process the name of this process is set (Fig. 6):

PS C:\u003e Get-Process explorer

In order to get a list of all processes, the names of which begin with a certain symbol, it is enough to indicate this symbol and "*" (Fig. 7):


PS C:\u003e Get-Process i *

Pay attention to the columns that contain information - Handles, NMP (K), etc. By default, the information is displayed as a table, but in fact all commands return objects. These objects can be passed to the input of other commands using the "|" (fig. 8):


PS C:\u003e Get-Process i * | format-list

The process list is now available in a different view. For details on the different formats, you can use the following command:

PS C:\u003e Help format *

Other possible formats:

PS C:\u003e Get-Process i * | format-wide

PS C:\u003e Get-Process i * | format-custom

Since the output is always an object, you can manipulate it to perform additional operations, such as filtering:

PS C:\u003e Get-Process | where ($ _. handlecount -gt 400)

or sorting:

PS C:\u003e Get-Process | where ($ _. handlecount -gt 400) | sort-object Handles

A quite reasonable question may arise: how did we know that the object that describes the process has the property handlecount? To get a list of all properties of an object, use the following command (Fig. 9):


PS C:\u003e Get-Process | Get-Member

Let's execute the command Get-Process | Get-Member Company - with default formatting, you cannot get the desired data. Let's transform the received command into:

PS C:\u003e Get-Process | Get-Member Company | Format-List

The result of its transformation is shown in Fig. ten.


PS C:\u003e Get-Process | sort-object Company | format-table -Group Company name, description, handles

The result of this command is shown in Fig. eleven.


Command stop-process lets stop running process, eg:

PS C:\u003e Get-process notepad | stop-process

This possibility is not always safe, so it is better to use similar commands with the option whatif, which shows what happens when a particular command is executed, but the command is not actually executed:

PS C:\u003e Get-Process notepad | stop-process –whatif

In addition, you can indicate the need for confirmation before executing the command:

PS C:\u003e Get-Process notepad | stop-process –confirm

The result of the command execution with confirmation is shown in Fig. 12.


In the last example, we get a description of the actions that the command performs, and we can choose whether to confirm its execution or not.

In addition, you can create your own batch files, which are * .ps1 files that contain PowerShell commands, and run them. Batch files must be signed for security. When testing, you can disable the requirement to run only signed files:

PS C:\u003e Set-ExecutionPolicy Unrestricted

but after testing is finished, remember to enable this option again with the following command:

PS C:\u003e Set-ExecutionPolicy AllSigned

After meeting with windows basics PowerShell let's see how you can use this utility to solve various administrative tasks.

Working with the file system

One of the tasks that many IT professionals often face is related to file manipulation, such as copying, moving, renaming, deleting files and directories. In fig. 13 shows the main windows commands PowerShell used to manipulate file system: new-item, copy-item, move-item, rename-item and remove-item.


Unlike other shells, which have both a set of commands for files (for example, delete or rename) and a set for directories (for example, rd or md), Windows PowerShell uses a single set of commands to manipulate both files and directories.

The first command in our example is new-item TextFiles –itemtype directory - used to create a new subdirectory of TextFiles in the current directory. If you omit the parameter –Itemtypethen Windows PowerShell will ask whether we are creating a file or a directory. Note that the team new-item there is an alias - ni. In short, our first command will look like this:

PS C:\u003e ni TextFiles –itemtype directory

Then we use the command copy-item (aliases - cpi, cp, copy) to copy all files with * .txt extension to the TextFiles subdirectory. If you use this command in batch file, it makes sense to make it clearer by specifying parameters –Path (source) and –Destination (receiver):

PS C:\u003e copy-item –path ‘. \\ *. Txt’ –destination ‘. \\ TextFiles’

After executing the copy command, we use the command set-location to go to the TextFiles subdirectory. Using the command rename-item rename the psdemo.txt file to psdemo.bak. Options can be applied as needed –Path and –NewName... After the file has been renamed, move it one level up using the command move-item... Then we use the command set-location, or rather, her alias sl to switch to another directory. We finish manipulating the file system by deleting the entire TextFiles directory using the command remove-item... Since the TextFiles directory contains files, the option applies –Recurse... If this option is not specified, Windows PowerShell will ask for confirmation before running the command remove-item.

Working with the registry

By doing different settings and trying to find any parameters, we sometimes have to turn to the system registry in search of keys, values, etc. Using the capabilities of Windows PowerShell, this task can be solved sufficiently in a simple way... The capabilities of Windows PowerShell are shown in Fig. fourteen.


Our first team uses an alias sl to execute the command set-locationwhich changes our current location from the filesystem to the HKEY_CURRENT_USER branch in the system registry:

PS C: \\\u003e sl hkcu:

Note that, as in the case of working with the file system, PowerShell uses a special provider to access the registry.

The commands are analogous to the above command:

PS C: \\\u003e sl registry: hkcu

PS C: \\\u003e sl hkey_current_user

The following command loads the contents of the entire HKEY_CURRENT_USER registry branch into the reg variable:

PS HKCU: \\\u003e $ reg \u003d gci. –Rec –ea silentlycontinue

For this we use the command get-childitem (alias - gci), the principle of which is similar to working with the file system. The first argument to this command is "." - indicates that we want to get the contents of the current registry branch - HKEY_CURRENT_USER. The second argument is short for option –Recurse and indicates that we need a recursive collection of data from all sub-branches of the current registry branch. Finally, the third argument is –Ea silentlycontinue - indicates that the command should continue to be executed even in case of errors related to lack of access rights to certain sub-branches of the registry.

The following command in our example:

PS HKCU: \\\u003e $ s \u003d $ reg | % (if (gp $ _. pspath) –match 'PowerShell') ($ _. pspath))

copies data from the registry containing a string ‘PowerShell’... We start by taking an object reg and redirect it to the command % which is the alias of the command for-each... It recursively traverses all the registry entries in the object reg and at each step stores the item in a special PowerShell object named ‘_’ ... In curly braces, we indicate the actions to be performed at each step of the command. for-each... Inside the block for-each we use check if in order to find out if the current registry entry and its pspath property, which we get through the call to the command get-itemproperty (via alias gp), our criterion is the presence of the line ‘PowerShell’... If a match is found, we return the property value pspath... All found matches are saved in the object s.

We finish working with the registry by redirecting search results to the command select-object (via alias select) and show the first two results found. As an exercise, you can redirect the final results to a file using the command out-file.

Access to processes

Another challenge that IT professionals may face is detecting system anomalies, such as processes that consume large amounts of memory. Let's see how this problem is solved windows tools PowerShell (Figure 15).


In the first command, we save information about all processes running on this computer in a variable $ allprocs:

PS C: \\\u003e $ allprocs \u003d get-process

After that, we redirect the received information to the command for-each, which can also be specified by an alias % or foreach... This command iterates over all objects associated with the process, and at each step saves information in an internal object $_ ... This object can be conventionally called the current object. As parameters for the command for-each we specify the comparison operation of the property value virtualmemorysize with the memory size of interest to us (20 MB in our example). If the value of this property for the current object is greater than the specified one, we display the process name on the screen. Note that PowerShell supports the main abbreviations for specifying sizes - KB, MB, GB, which is very useful, since you do not need to count zeros when specifying the amount of memory, disks, etc.

System log access

When trying to find the causes of failures, we often refer to the system log, which stores many useful information about the events that took place in the system. Usually for research syslog the Event Viewer utility (eventvwr.exe) is used. In PowerShell, we can use built-in commands, such as the command get-eventlogto quickly examine the contents of the system log (Fig. 16).


Our first team loads key information from syslog:

PS C: \\\u003e get-eventlog –list

Without using the option –List PowerShell will ask you for the exact name of the syslog. In our example, we see several entry points in the syslog: Application, Internet Explorer, System, Windows Power Shell, etc. Our next command retrieves syslog entries that are of type "Error":

PS C: \\\u003e $ bad \u003d get-eventlog “System” | where-object ($ _. EntryType –eq “Error”)

We use the command get-eventlog, to which we specify the parameter "System" to retrieve only system records - we could have made this clearer by using the parameter logName... Variable content $ bad passed to the input to the command where-object to filter only records of interest to us. As command arguments where-object we indicate that we are looking only for records that have the property EntryType equally "Error".

We conclude our examination of the syslog by displaying five recent entries about errors using the command select-object with parameter –Last:

PS C: \\\u003e $ bad | select-object –last 5

WMI access

As we know, Windows Management Instrumentation (WMI) is Microsoft's implementation of the Common Information Model (CMI) standard. In most cases, WMI is used by IT professionals to obtain information about hardware and softwareinstalled on this computer. As we will see in the next example, using windows PowerShell makes it much easier to access the information stored in WMI (Figure 17).


On the first line, we use the command get-wmiobject to get information about the file used to swap memory to disk and store this information in a variable $ pfu:

PS C: \\\u003e $ pfu \u003d get-wmiobject - class 'win32_pageFileUsage'

PS C: \\\u003e $ pfu | get-member –membertype property | where_object ($ _. name –nomatch ‘_’)

Typically, you can use the command to find information on a specific class get-member without specifying parameters, but in our example we are only interested in available properties and only those that do not contain the underscore character in the name. An attentive reader may ask how we learned about the existence of the class win32_pageFileUsage? After all, it is known that more than a thousand classes are supported in WMI; in addition, a number of applications add their own classes. You can use the command:

PS C: \\\u003e get-wmiobject –list

to get a list of all classes in the system. After we have defined the properties of the class available to us, we display the contents of the properties we are interested in on the screen:

PS C: \\\u003e $ pfu.caption; $ pfu.currentusage

The second part of our example is dedicated to another class - win32_DiskDrive, which stores information about the disks installed in the system. This class is an example of a WMI class that contains more than one object. In our example, we define the value of the property caption the first disk installed on the system:

PS C: \\\u003e $ dd.caption

Using XML files

AT recent times XML files are increasingly used to store configuration information. As the data accumulates in the XML file, it becomes less and less readable. Next, we'll look at how to apply windows functions PowerShell for working with XML files.

For example, let's take the configuration windows file Calendar, which looks like this (Figure 18):

and perform the manipulations on it, shown in Fig. 19.

In the first line, we load the contents of the entire XML file into a variable using the command get-content:

PS C: \\\u003e $ doc \u003d get-content ‘. \\ Settings.xml’

Pay attention to the use of the data type : if you do not specify the use of data of this type, just text will be loaded into the variable.

On the second line, we select a specific branch of the XML file - for this, the method is applied selectnodes an object that stores XML data and an XPath description of the branch address:

PS C: \\\u003e $ settings \u003d $ doc.selectnode (‘CalendarSettings / X-Root / VCalendar’)

After that we use the command foreach-object to get property value Name for all elements in this branch.

Conclusion

We have covered the main windows capabilities PowerShell to simplify the tasks of IT pros. As we know, these tasks are often accomplished using the VBScript scripting language. Windows PowerShell has the ability to leverage existing VBScript code, and therefore greatly simplifies migration (Figure 20).


The above example shows how you can use existing VBScript code in PowerShell. In the first line, we create a new COM object that is the core of scripting programs - ScriptControl. We then indicate that we will be using the Visual Basic Script language. The third line specifies the actual VBScript code - in our example, this is a call to the MsgBox function, but in practice, you can, for example, load the file code into a variable. Finally, on the last line, we add VBScript code to our object - and the code goes to execution.

Network resources

Product team blog: http://blogs.msdn.com/PowerShell/.

Utilities, Editors & Addons: http://www.powershell.com/.

Blog by Dmitry Sotnikov from Quest: http://dmitrysotnikov.wordpress.com/.

PowerGadgets - An example of unlimited PowerShell extensibility:

Did you like the article? To share with friends: