<#
.SYNOPSIS
This script creates a function to display a message
in a message block, then demonstrates its usage
.DESCRIPTION
This script used Windows Forms to put up a message
box containing text and a window title passed as
parameters
.NOTES
File Name : Show-Message.ps1
Author : Thomas Lee - tfl@psp.co.uk
Requires : PowerShell Version 3.0
.LINK
This script posted to:
http://www.pshscripts.blogspot.com
.EXAMPLE
Left as an exercise to the Reader
#>
Function Show-Message {
[CmdletBinding()]
Param (
[Parameter(Mandatory=$True,
HelpMessage="Content of Message box")]
[string]$Message ,
[Parameter(Mandatory=$False,
HelpMessage="Title for Message box")]
[string]$BoxTitle = "Message"
)
# just in case, load the relevant assembly
$v1 = [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
# now use the messagebox class to display the message
[Windows.Forms.MessageBox]::Show($Message, $BoxTitle,
[Windows.Forms.MessageBoxButtons]::OK ,
[Windows.Forms.MessageBoxIcon]::Information)
} # End of function
# Set an alias
Set-Alias sm Show-Message
# call the function
sm 'testing' 'details, details'
This blog contains PowerShell scripts, more PowerShell scripts and still more PowerShell scripts. Occasionally you may see some organisational posts.
Thursday, 23 January 2014
Show-Message.ps1
Sunday, 5 January 2014
Show-TimeSpanFormatting.ps1
<#
.SYNOPSIS
This script demonstrates formatting System.TimeSpan objects
Using PowerShell
.DESCRIPTION
This scipt re-writes some MSDN Samples that demostarate
timespan formatting - the original article lacks PowerShell
Examples. And sadly, the MSDN page no longer accepts community
additions.
.NOTES
File Name : Show-TimeSpanFormatting
Author : Thomas Lee - tfl@psp.co.uk
Requires : PowerShell Version 3.0
.LINK
This script posted to:
http://pshscripts.blogspot.co.uk/2014/01/show-timespanformattingps1.html
Reference MSDN Page
http://msdn.microsoft.com/en-us/library/ee372286%28v=vs.110%29.aspx
.EXAMPLE
Psh> .\Show-TimeSpanFormatting.ps1
Example 1
Time of Travel: 1.12:24:02
Time of Travel: 1.12:24:02
Example 2
Converted '1.03:14:56.1667' to 1.03:14:56.1667000
Converted '1.03:14:56.1667' to 1.03:14:56.1667000
Example 3
07:45:16 - 18:12:38 = -10:27:22
07:45:16 + 18:12:38 = 1.01:57:54
00:01:14.3650000 + 00:00:00.2143756 = 00:01:14.5793756
Example 4
7:45:16 - 18:12:38 = -10:27:22
7:45:16 + 18:12:38 = 1:1:57:54
0:01:14.036 + 0:00:00.2143756 = 0:01:14.2503756
Example 5
0:07:45:16.0000000 - 0:18:12:38.0000000 = -0:10:27:22.0000000
0:07:45:16,0000000 + 0:18:12:38,0000000 = 1:01:57:54,0000000
0:00:01:14.0360000 + 0:00:00:00.2143756 = 0:00:01:14.2503756
#>
# Show Time Span Format Strings
# Example 1 - use both tostring() and -f operators
"Example 1"
# Create Timespan object
$duration = New-Object System.TimeSpan 1, 12, 23, 62
# Now output using both tostring() and -f
"Time of Travel: " + $duration.ToString("c")
"Time of Travel: {0:c}" -f $duration
# Example 2
# Demonstrate the use of ParseExact and TryParseExact
"Example 2"
$value = "1.03:14:56.1667"
$interval = New-Object System.TimeSpan
Try {
$interval = [System.TimeSpan]::ParseExact($value, "c", $null)
"Converted '{0}' to {1}" -f $value, $interval
}
Catch [System.FormatException] {"{0}: Bad Format" -f $value}
Catch [System.OverflowException] {"{0}: Out of Range" -f $value }
If ([System.TimeSpan]::TryParseExact($value, "c", $null, [ref] $interval)) {
"Converted '{0}' to {1}" -f $value, $interval
}
Else {
"Unable to convert {0} to a time interval." -f $value
}
# Example 3
# Create two TimeSpan objects, perform arithmetic operations
# on them then displays the result using the 'C' format specifier
"Example 3"
$interval1 = New-Object System.TimeSpan 7, 45, 16
$interval2 = New-Object System.TimeSpan 18, 12, 38
"{0:c} - {1:c} = {2:c}" -f $interval1,$interval2, $($interval1 - $interval2)
"{0:c} + {1:c} = {2:c}" -f $interval1,$interval2, $($interval1 + $interval2)
$interval1 = New-Object System.TimeSpan 0, 0, 1, 14, 365
$interval2 = [System.TimeSpan]::FromTicks(2143756)
"{0:c} + {1:c} = {2:c}" -f $interval1, $interval2, $($interval1 + $interval2)
# Example 4 - The "g" Format Specifier
# This specifier returns the string representation of a TimeSpan value in a compact form
# by including only the elements that are necessary.
"Example 4"
$interval1 = New-Object System.TimeSpan 7, 45, 16
$interval2 = New-Object System.TimeSpan 18, 12, 38
"{0:g} - {1:g} = {2:g}" -f $interval1, $interval2, $($interval1 - $interval2)
# do it in French
$CI = New-object System.Globalization.CultureInfo 'fr-FR'
[System.String]::Format($CI, $("{0:g} + {1:g} = {2:g}") ,
$interval1,$interval2,$($interval1 + $interval2) )
# Another interval
$interval1 = new-object System.TimeSpan 0, 0, 1, 14, 36
$interval2 = [System.TimeSpan]::FromTicks(2143756)
"{0:g} + {1:g} = {2:g}" -f $interval1, $interval2, $($interval1 + $interval2)
# Example 5
# Using the "G' Specifier
#
"Example 5"
$interval1 = new-object System.TimeSpan 7, 45, 16
$interval2 = new-object System.TimeSpan 18, 12, 38
"{0:G} - {1:G} = {2:G}" -f $interval1, $interval2, $($interval1 -$interval2)
[System.String]::Format($(New-Object CultureInfo("fr-FR")),
"{0:G} + {1:G} = {2:G}", $interval1,
$interval2, $($interval1 + $interval2))
$interval1 = new-object System.TimeSpan 0, 0, 1, 14, 36
$interval2 = [System.TimeSpan]::FromTicks(2143756)
"{0:G} + {1:G} = {2:G}" -f $interval1,$interval2, $($interval1 + $interval2)
Thursday, 14 November 2013
Fix-FileName.ps1
- <#
- .SYNOPSIS
- Defines a function to remove 'invalid' characters
- from a file name.
- .DESCRIPTION
- Some programs do not like certain 'invalid' characters
- in a file name used by that application. The function
- takes a look at each the file name and replaces some invalid
- characters with '-'.
- This function takes a file name and 'fixes' it and returns
- the 'fixed' file name. Needless to say the characters to match
- and what to replace them with is an application specific decision!
- .NOTES
- File Name : Fix-FileName.ps1
- Author : Thomas Lee - tfl@psp.co.uk
- Requires : PowerShell Version 3.0
- .LINK
- This script posted to:
- http://www.pshscripts.blogspot.com
- .EXAMPLE
- Psh> .\Fix-FileName.ps1
- File name was: 123{}{{{|[\]
- Fixed name is: 123--------
- #>
- Function Fix-FileName {
- [CMdletbinding()]
- Param (
- $fn = $(throw 'no file name specified - returning')
- )
- Switch -Regex ($fn) {
- "}" { $fn = $fn -replace '{','-' }
- "}" { $fn = $fn -replace '}','-' }
- "\]" { $fn = $fn -replace ']','-' }
- "\[" { $fn = $fn -replace '\[','-' }
- "\\" { $fn = $fn -replace '\\','-' }
- "\|" { $fn = $fn -replace '\|','-' }
- }
- $fn
- }
- $fn = "123{}{{{|[\]"
- $fnf = Fix-FileName $fn
- "File name was: $fn"
- "Fixed name is: $fnf"
Wednesday, 16 October 2013
Get-SQLServer2.ps1
- #Requires -Version 3.0
- <#
- .SYNOPSIS
- This script Gets a list of SQL Severs on the Subnet
- .DESCRIPTION
- This script uses SMO to Find all the local SQL Servers
- and displays them
- .NOTES
- File Name : Get-SQLServer2.ps1
- Author : Thomas Lee - tfl@psp.co.uk
- Requires : PowerShell Version 3.0
- .LINK
- This script posted to:
- http://www.pshscripts.blogspot.com
- .EXAMPLE
- PS> # On a Lync Server looking at Lync Implementation
- PS> Get-SQLServer2
- There are 7 SQL Server(s) on the Local Subnet
- ServerName InstanceName Version
- ---------- ------------ -------
- 2013-LYNC-MGT MON 10.50.2500.0
- 2013-LYNC-MGT SCOM 10.50.2500.0
- 2013-TS RTCLOCAL 11.0.2100.60
- 2013-SHAREPOINT SPSDB 11.0.3000.0
- 2013-LYNC-FE RTC 11.0.2100.60
- 2013-LYNC-FE RTCLOCAL 11.0.2100.60
- 2013-LYNC-FE LYNCLOCAL 11.0.2100.60
- #>
- Import-Module SQLPS
- # Now get all the database servers on the local subnet
- $SQLservers = [System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources()
- $Srvs= @()
- # Convert collection to an array
- Foreach ($srv in $SQLservers) {
- $srvs += $srv
- }
- # Now display results
- If ($Srvs.count -LE 0) {
- "There are no SQL Servers on the Local Subnet"
- return
- }
- # Now print server details
- "There are {0} SQL Server(s) on the Local Subnet" -f $Srvs.count
- $Srvs | Select ServerName, InstanceName, Version | Format-Table -AutoSize
Technorati Tags: SQL Server 2012,SQL Server 2012 SMOs
Labels:
PowerShell Script,
SMO,
SQL,
SQL Server 2012
Saturday, 12 October 2013
Get-OLCalendarItem
- Function Get-OLCalendarItem {
- <#
- .SYNOPSIS
- A function to retreive Outlook Calender items between two dates.
- Returns PSobjects containing each item.
- .DESCRIPTION
- The function opens one's outlook calender, then retrieves the items.
- The function takes 2 parameter: start, end - items are returned that
- start betweween these two dates.
- .NOTES
- File Name : Get-OLCalendarItem
- Author : Thomas Lee - tfl@psp.co.uk
- Requires : PowerShell Version 3.0
- .LINK
- This script posted to:
- http://www.pshscripts.blogspot.com
- .EXAMPLE
- Left as an exercise for the reader
- #>
- [CmdletBinding()]
- Param (
- $start = $(Get-Date) ,
- $end = $((Get-date).AddMonths(1))
- )
- Write-Verbose "Returning objects between: $($start.tostring()) and $($end.tostring())"
- # Load Outlook interop and Outlook iteslf
- [Reflection.Assembly]::LoadWithPartialname("Microsoft.Office.Interop.Outlook") | out-null
- $Outlook = new-object -comobject outlook.application
- # Get OL default folders
- $OlFolders = "Microsoft.Office.Interop.Outlook.OlDefaultFolders" -as [type]
- $Namespace = $Outlook.GetNameSpace("MAPI")
- $Calendar = $namespace.GetDefaultFolder($olFolders::olFolderCalendar)
- Write-Verbose "There are $($calendar.items.count) items in the calender in total"
- # Now return psobjects for all items between 2 dates
- ForEach ($citem in ($Calendar.Items | sort start)) {
- #Write-Verbose "Processing [$($citem.Subject)] Starting: [$($Citem.Start)]"
- If ($citem.start -ge $start -and $citem.start -LE $end) {
- $CalHT =[ordered] @{
- Subject = $($Citem.Subject)
- Location = $($Citem.Location);
- Start = $(Get-Date $Citem.Start);
- StartUTC = $(Get-Date $Citem.StartUTC);
- End = $(Get-Date $Citem.End);
- EndUTC = $(Get-Date $Citem.EndUTC);
- Duration = $($Citem.Duration);
- Importance = $($Citem.Importance);
- IsRecurring = $($Citem.IsRecurring);
- AllDayEvent = $($citem.AllDayEvent);
- Sensitivity = $($Citem.Sensitivity);
- ReminderSet = $($Citem.ReminderSet);
- CreationTime = $($Citem.CreationTime);
- LastModificationTime = $($Citem.LastModificationTime);
- Body = $($Citem.Body);
- }
- # Write the item out as a custom item
- $o=New-Object PSobject -Property $CalHT
- Write-Output $o
- }
- } #End of foreach
- } # End of function
- Set-Alias GCALI Get-OLCalendarItem
Wednesday, 28 August 2013
Get-DHCPPerf.Ps1
- <#
- .SYNOPSIS
- This script gets and displays perf counters for DHCP
- .DESCRIPTION
- This script uses the Get-Counter cmdlet to get all
- the counters for DHCP. The function does this for one
- DHCP server at a time.
- .NOTES
- File Name : Show-.ps1
- Author : Thomas Lee - tfl@psp.co.uk
- Requires : PowerShell Version 2.0
- .LINK
- This script posted to:
- http://www.pshscripts.blogspot.com
- .EXAMPLE
- C:\Foo> Get-DHCPPerformanceCounters -comp dhcp2
- Performance counters for: dhcp2
- \\dhcp1\dhcp server\failover: bndupd dropped. 0
- \\dhcp1\dhcp server\failover: transitions to recover state. 8
- \\dhcp1\dhcp server\failover: transitions to partner-down state. 0
- \\dhcp1\dhcp server\failover: transitions to communication-interrupted state. 9
- \\dhcp1\dhcp server\failover: bndupd pending in outbound queue. 0
- \\dhcp1\dhcp server\failover: bndack received/sec. 0
- \\dhcp1\dhcp server\failover: bndack sent/sec. 0
- \\dhcp1\dhcp server\failover: bndupd received/sec. 0
- \\dhcp1\dhcp server\failover: bndupd sent/sec. 0
- \\dhcp1\dhcp server\denied due to nonmatch. 0
- \\dhcp1\dhcp server\denied due to match. 0
- \\dhcp1\dhcp server\offer queue length 0
- \\dhcp1\dhcp server\releases/sec 0
- \\dhcp1\dhcp server\declines/sec 0
- \\dhcp1\dhcp server\nacks/sec 0
- \\dhcp1\dhcp server\acks/sec 0
- \\dhcp1\dhcp server\informs/sec 0
- \\dhcp1\dhcp server\requests/sec 0
- \\dhcp1\dhcp server\offers/sec 0
- \\dhcp1\dhcp server\discovers/sec 0
- \\dhcp1\dhcp server\conflict check queue length 0
- \\dhcp1\dhcp server\active queue length 0
- \\dhcp1\dhcp server\milliseconds per packet (avg). 28
- \\dhcp1\dhcp server\packets expired/sec 0
- \\dhcp1\dhcp server\duplicates dropped/sec 0
- #>
- # Get-DHCPPerformanceCounters function
- Function Get-DHCPPerformanceCounters {
- Param (
- $comp = 'localhost')
- # Get DHCP Counters
- $set = get-counter -listset "DHCP Server"
- $ctrs = $set.counter
- " Performance counters for: {0}" -f $comp
- # For each counter, get the sample
- foreach ($ctr in $ctrs) {
- $sample = (get-counter $ctr).countersamples
- "{0,-78} {1,10}" -f $sample.path, $sample.cookedvalue
- }
- }
- # Now test it
- Get-DHCPPerformanceCounters -comp dhcp1
- Get-DHCPPerformanceCounters -comp dhcp2
Technorati Tags: DHCP
Monday, 29 July 2013
Get-Zip.ps1
- <#
- .SYNOPSIS
- This script demonstrates the use of the Zip lib in .NET
- .DESCRIPTION
- This script is a re-write of an MSDN sample, using PowerShell
- .NOTES
- File Name : Show-ZIP.ps1
- Author : Thomas Lee - tfl@psp.co.uk
- Requires : PowerShell Version 3.0
- .LINK
- This script posted to:
- http://www.pshscripts.blogspot.com
- MSDN sample posted to:
- http://msdn.microsoft.com/en-us/library/system.io.compression.zipfile.aspx
- .EXAMPLE
- PSH> .\Show-Zip
- Directory: C:\example
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- d---- 7/29/2013 4:35 PM extract
- d---- 7/29/2013 4:29 PM start
- -a--- 7/29/2013 4:35 PM 1668 result.zip
- Directory: C:\example\extract
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- -a--- 7/29/2013 4:28 PM 5609 d1.txt
- -a--- 7/29/2013 4:29 PM 67308 d2.txt
- -a--- 7/29/2013 4:29 PM 67308 d3.txt
- -a--- 7/29/2013 4:29 PM 67308 d4.txt
- -a--- 7/29/2013 4:29 PM 67308 d5.txt
- Directory: C:\example\start
- Mode LastWriteTime Length Name
- ---- ------------ ------ ----
- -a--- 7/29/2013 4:28 PM 5609 d1.txt
- -a--- 7/29/2013 4:29 PM 67308 d2.txt
- -a--- 7/29/2013 4:29 PM 67308 d3.txt
- -a--- 7/29/2013 4:29 PM 67308 d4.txt
- -a--- 7/29/2013 4:29 PM 67308 d5.txt
- #>
- # Load the compression namespace
- # And yes, I know this usage is obsolete - but it works.
- # Ignore the output
- [System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') | out-null
- # Set locations
- $startPath = "c:\example\start"
- $zipPath = "c:\example\result.zip"
- $extractPath = "c:\example\extract"
- Remove-Item $zipPath -ea SilentlyContinue
- Remove-Item -Path $extractPath -inc * -Recurse -ea SilentlyContinue
- # Create the zip file
- [System.IO.Compression.ZipFile]::CreateFromDirectory($startPath, $zipPath)
- # Extract from zip and show what's all there
- [System.IO.Compression.ZipFile]::ExtractToDirectory($zipPath,$extractPath);
- ls c:\example -Recurse
Technorati Tags: System.Io.Compression,ZipFile
Labels:
System.Io.Compression.FileSystem,
Zipfile
Sunday, 28 July 2013
Show-NumberGroupSizes.ps1
- <#
- .SYNOPSIS
- This script demonstrates the use of the NumberGroupSizes
- .DESCRIPTION
- This script is a re-write of an MSDN sample, using PowerShell
- .NOTES
- File Name : Show-NumberGroupSizes.ps1
- Author : Thomas Lee - tfl@psp.co.uk
- Requires : PowerShell Version 3.0
- .LINK
- This script posted to:
- http://www.pshscripts.blogspot.com
- MSDN sample posted to:
- http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.numbergroupsizes%28v=vs.100%29.aspx
- .EXAMPLE
- PSH> .\Show-NumberGroupSizes.ps1
- 123,456,789,012,345.00
- 12,3456,7890,123,45.00
- 1234567890,123,45.00
- #>
- # Get Number Format
- $nf = New-Object System.Globalization.CultureInfo "en-US", $False
- $nfi = $nf.NumberFormat
- [Int64] $myInt = 123456789012345
- $myInt.ToString( "N", $nfi )
- # Display the same value with different groupings
- [int[]] $MySizes1 = 2,3,4
- [int[]] $MySizes2 = 2,3,0
- $nfi.NumberGroupSizes = $mySizes1
- $myInt.ToString( "N",$nfi )
- $nfi.NumberGroupSizes = $mySizes2
- $myInt.ToString( "N", $nfi )
Friday, 28 June 2013
Show-CurrencyFormatting.ps1
- <#
- .SYNOPSIS
- This script re-implements an MSDN Sample showing the
- use of the NumberFormat class to nicely format things
- in this case, currency.
- .DESCRIPTION
- This script iterates through the Windows cultures and
- displays those whose 2-letter ISO code is 'en' and
- displays how Windows formats currency in that culture.
- .NOTES
- File Name : Show-CurrencyFormatting.ps1
- Author : Thomas Lee - tfl@psp.co.uk
- Requires : PowerShell Version 2.0
- .LINK
- This script posted to:
- http://www.pshscripts.blogspot.com
- MSDN sample posted to:
- http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx
- .EXAMPLE
- Psh > .\Show-CurrencyFormatting.ps1
- The currency symbol for 'English (United States)' is '$'
- The currency symbol for 'English (United Kingdom)' is '£'
- The currency symbol for 'English (Australia)' is '$'
- The currency symbol for 'English (Canada)' is '$'
- The currency symbol for 'English (New Zealand)' is '$'
- The currency symbol for 'English (Ireland)' is '€'
- The currency symbol for 'English (South Africa)' is 'R'
- The currency symbol for 'English (Jamaica)' is 'J$'
- The currency symbol for 'English (Caribbean)' is '$'
- The currency symbol for 'English (Belize)' is 'BZ$'
- The currency symbol for 'English (Trinidad and Tobago)' is 'TT$'
- The currency symbol for 'English (Zimbabwe)' is 'Z$'
- The currency symbol for 'English (Republic of the Philippines)' is 'Php'
- The currency symbol for 'English (Singapore)' is '$'
- The currency symbol for 'English (Malaysia)' is 'RM'
- The currency symbol for 'English (India)' is 'Rs.'
- #>
- # Loop through all the specific cultures known to the CLR.
- foreach ($ci in [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::SpecificCultures))
- {
- # Only show the currency symbols for cultures that speak English.
- if ($ci.TwoLetterISOLanguageName -eq "en") {
- # Display the culture name and currency symbol.
- $nfi = $ci.NumberFormat
- "The currency symbol for '{0}' is '{1}'" -f $ci.DisplayName, $nfi.CurrencySymbol
- }
- }
Subscribe to:
Posts (Atom)