<#
.SYNOPSIS
MSDN sample showing push and other stack processing using PowerShell
.DESCRIPTION
This script creates a script then performs stack operations.
.NOTES
File Name : Get-Stack1.p1
Author : Thomas Lee - tfl@psp.co.uk
Requires : PowerShell V2
.LINK
http://www.pshscripts.blogspot.com
.EXAMPLE
PSH [C:\foo]: .\get-stack1.ps1'
Stack at start:
fox
quick
The
(Pop) fox
Stack value after Pop:
brown
quick
The
(Pop) brown
Stack values after 2nd pop:
quick
The
(Peek) quick
Stack values after a peek:
quick
The
#>
##
# start of script
###
# Create and initialise a new stack object
$mystack = new-object system.collections.stack
$myStack.Push( "The" )
$myStack.Push( "quick" )
$myStack.Push( "brown" )
$myStack.Push( "fox" )
# Display the Stack
"Stack at start:"
$myStack
""# Pop an element from the Stack.
"(Pop)`t`t{0}" -f $myStack.Pop()
"Stack value after Pop:"
$myStack
""
# Pop another element from the Stack
"(Pop)`t`t{0}" -f $myStack.Pop()
# Display the Stack after 2nd pop
"Stack values after 2nd pop:"
$myStack
""
# Peek at the front
"(Peek)`t`t{0}" -f $myStack.peek()
# Display the Stack after the peek
"Stack values after a peek:"
$myStack
This blog contains PowerShell scripts, more PowerShell scripts and still more PowerShell scripts. Occasionally you may see some organisational posts.
Friday, 28 November 2014
Get-Stack1.ps1
Labels:
powershell,
system.collections.stack
Thursday, 27 November 2014
Zip-Pshscripts3.ps1
#Requires –Version 5.0 # #.Synopsis # Creates a zip file of PowerShell scripts #.Description # The script creates a zip file containing all the files, # recursing through the top level PowerShell Script Library folder. # #.Notes # This script require PowerShell V5 for the zip file cmdlets! # Author - Thomas Lee - tfl@psp.co.uk # #.Example # PS [c:\foo]> .\Zip-PSHScripts3.ps1 # Total files : 347 # ps1 files : 342 # txt files : 1 # other files : 4 # Define what to zip and from where $zipfile = "C:\foo\ScriptLib.ZIP" $zipfrom = "C:\Users\tfl\Dropbox\PowerShell Script Library (master)" $recurse = "true" $ziptoadd = "ps1" # Check it out if ( ! (Test-path -Path $zipfrom )) { Write-Host 'scripts folder does not exist' } # Zip it up! Try { Compress-Archive -Path $zipfrom -DestinationPath $zipfile -CompressionLevel Optimal -Update } Catch { Write-Host ' Error Zipping up the script library' $Error[0] } # Stats $files = ls $zipfrom -file -recurse $files_ps1 = $files | Where-Object Extension -eq '.ps1' $files_txt = $files | Where-Object Extension -eq '.txt' $files_other = $files | Where-Object { $_.extension -NE '.PS1' -and $_.Extension -ne '.txt'} "Total files : {0}" -f $($files.count) "ps1 files : {0}" -f $($files_ps1.count) "txt files : {0}" -f $($files_txt.count) "other files : {0}" -f $($files_other.count) # All done ls $zipfile
Tuesday, 1 July 2014
Zip-Pshscripts.ps1
<# .SYNOPSIS Creates a zip file from a folder structure and uploads it to an FTP site. .DESCRIPTION Creates a zip file of all the scripts in the script library, then uses system.net.webrequest to uploade it to a web site. Uses ICSharpCode.SharpZipLib.dll See http://www.icsharpcode.net/OpenSource/SharpZipLib/ .NOTES File Name : zip-pshscripts.PS1 Author : Thomas Lee - tfl@psp.co.uk Requires : PowerShell V2 NB:The credentials shown here do not work (well they shouldn't) .LINK http://pshscripts.blogspot.com .EXAMPLE Assuming credentials were correct, an example would be PS C:\foo> zip-pshscripts.PS1 Directory: C:\foo Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 12/29/2008 11:34 AM 68722 PSScriptLib.ZIP Upload Stats: 226-Maximum disk quota limited to 100000 Kbytes Used disk quota 63140 Kbytes, available 36859 Kbytes 226 Transfer complete. #> ## # Start of script ## # First, load the zip library [void] [System.Reflection.Assembly]::LoadFrom("C:\foo\bin\ICSharpCode.SharpZipLib.dll") # Now create a new zip file object $zip = new-object ICSharpCode.SharpZipLib.Zip.FastZip # Define what to zip and from where $zipfile = "C:\foo\PSScriptLib.ZIP" $zipfrom = "E:\PowerShellScriptLib" $recurse = "true" $ziptoadd = ".ps1" # Now create the zip file $zip.CreateZip($zipfile, $zipfrom, $recurse, $ziptoadd) ls $zipfile # Here upload it $sendto = "ftp://www.reskit.net/powershell/scriptlib.zip" $ftprequest = [system.net.ftpwebrequest]::Create($Sendto) $ftprequest.Method = "STOR" # Now get the zip file and store it into $fileconents $file = Get-Content $zipfile $enc = [system.text.encoding]::default [byte[]] $filebyte= $enc.getbytes($file) # Set the length of the file to be sent $length = (ls $zipfile).length $ftprequest.ContentLength = $length # Now upload the file # Let's assume the ftp server is anonomyous (it's not of course!). $ftprequest.Credentials = New-Object system.Net.NetworkCredential "anonymous","tfl@psp.co.uk" $requestStream = $ftprequest.GetRequestStream() $requestStream.Write($filebyte, 0, $length) # Close file and get response $requestStream.Close() $response = $ftprequest.GetResponse(); # Display stats "Upload Stats:" $response.StatusDescription # Close response $response.Close();
Thursday, 23 January 2014
Show-Message.ps1
<#
.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'
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
Subscribe to:
Posts (Atom)