header image

Archive for Uncategorized

Pet peeves

Posted by: | August 31, 2019 Comments Off on Pet peeves |

Back in July I mentioned the using ? instead of Where-Object was a pet peeve. I’ve been asked a few times since for other pet peeves. The order of peevishness changes over time but these three will probably be always near the top.

 

In no particular order.

 

Peeve – the use of aliases in scripts. Aliases are fine for interactive use but when coding scripts or modules you should ALWAYS use the full cmdlet name and parameter names. If you use VScode or ISEsteroids you’ll find warning messages about the use of aliases. The problem with using aliases is that it makes the code harder to maintain especially for new comers. if you want to write impenetrable code that no one can read then switch to Perl. PowerShell has verb-noun cmdlet naming conventions and good (usually) parameter names for a reason. It makes the code easier to read and therefore understand and maintain. I guarantee that you’d rather inherit some code that uses full names rather than all aliases – been there, done that and its painful.

 

Peeve – the use of posh as an abbreviation for PowerShell. Its not needed and doesn’t add anything to the conversation. Just don’t.

 

Peeve – the use of multiple calls to Add-Member to create an object. You had to do this back in PowerShell v1. You should use New-Object or create a class to define your object. Its more efficient and easier to maintain. Don’t keep using outdated techniques just because there are still examples on the Internet.

 

I’ll publish more peeves sometime in the future.

under: Uncategorized

MVP award

Posted by: | July 1, 2019 Comments Off on MVP award |

I received the email this afternoon informing that I’d been awarded MVP status for another year – the 12th year I’ve received the MVP award.

I’m highly honoured to receive this and thank everyone who’ve read my blog, my articles or books, or listened to my talks.

under: Uncategorized

Avoid the truncation in the display

Posted by: | December 10, 2017 Comments Off on Avoid the truncation in the display |

A question came up regarding my recent post about using the file system COM object to get folder sizes. The question was about the folder path and how you could see the whole path. In other words how to avoid the truncation in the display and the three dots.

When PowerShell displays objects it will automatically use a table format if the object has four properties or less. It uses a list if there are more properties. This behaviour can be overridden by PowerShell’s formatting system. This behaviour can lead to truncation of one or more fields.

This is the function to get folder sizes

function Get-FolderSize { 
 [CmdletBinding()] 
param ( 
  [string]$path = 'C:\MyData' 
 )

if (-not (Test-Path -Path $path)){ 
  Throw "$path - Path not found" 
 }

$fso = New-Object -ComObject "Scripting.FileSystemObject"

Get-ChildItem -Path $path -Directory -Recurse | 
foreach { 
  
  $size = ($fso.GetFolder("$($PSItem.FullName)")).Size 
  
  $props = [ordered]@{ 
    Name = $PSItem.Name 
    Created = $PSItem.CreationTime 
    FilePath = $PSItem.FullName 
    SizeMB = [math]::Round( ($size / 1mb), 2) 
  }

  New-Object -TypeName PSObject -Property $props 
 }

}

 

If you just use the function as is

PS> Get-FolderSize -path C:\MyData\OneDrive\Data\Scripts

You can get truncated output – and you don’t see the size!

Office-Excel                         10/02/2017 19:16:29 C:\MyData\OneDrive\Data\Scripts\Office-... 
Office-OneNote                       10/02/2017 19:16:26 C:\MyData\OneDrive\Data\Scripts\Office-... 
Office-Outlook                       10/02/2017 19:16:29 C:\MyData\OneDrive\Data\Scripts\Office-... 
Office-PowerPoint                    10/02/2017 19:16:29 C:\MyData\OneDrive\Data\Scripts\Office-... 
Office-Visio                         10/02/2017 19:18:00 C:\MyData\OneDrive\Data\Scripts\Office-... 
Office-Word                          10/02/2017 19:16:23 C:\MyData\OneDrive\Data\Scripts\Office-...

 

You could use Format-List

PS> Get-FolderSize -path C:\MyData\OneDrive\Data\Scripts | Format-List

which means you get lots of displays like this:

Name     : Event Filters 
Created  : 10/02/2017 19:16:31 
FilePath : C:\MyData\OneDrive\Data\Scripts\WMICookBook\PowerEvents\PowerEvents\Samples\Event 
           Filters 
SizeMB   : 0.02

 

Using Format-Table with the –wrap parameter will avoid the truncation

PS> Get-FolderSize -path C:\MyData\OneDrive\Data\Scripts | Format-Table –AutoSize –Wrap

Samples                                10/02/2017 19:16:31 C:\MyData\OneDrive\Data\Scripts\WMICookBook\PowerEvent 
                                                            s\PowerEvents\Samples                                 
Event Consumers                        10/02/2017 19:16:31 C:\MyData\OneDrive\Data\Scripts\WMICookBook\PowerEvent 
                                                           s\PowerEvents\Samples\Event Consumers                 
Event Filters                          10/02/2017 19:16:31 C:\MyData\OneDrive\Data\Scripts\WMICookBook\PowerEvent 
                                                            s\PowerEvents\Samples\Event Filters                   
ConfigMgr                              10/02/2017 19:16:31 C:\MyData\OneDrive\Data\Scripts\WMICookBook\PowerEvent 
                                                            s\PowerEvents\Samples\Event Consumers\ConfigMgr

 

Notice that the Size is again cut off.  You need to ensure that your output pane in ISE or the PowerShell console is wide enough to display all the fields or PowerShell will truncate the display – without telling you

under: Uncategorized

LAST CALL for European PowerShell Summit 2014

Posted by: | September 6, 2014 Comments Off on LAST CALL for European PowerShell Summit 2014 |

This is the last call for attendee registration for the European PowerShell Summit 2014.

The Summit is in Amsterdam – 29 September to 1 October 2014. Details from the events page http://powershell.org/wp/community-events/summit/.

 

Due to a change in circumstances beyond our control  we have to close public registration on 10 September 2014.

 

If you contact us by 10 September and ask to be able to perform a funds transfer rather than paying on line you have until 15 September 2014 to complete that transaction. No monies or registrations will be accepted after 15 September. We will not accept any new request for paying by money transfer after 10 September.

 

Apologies for the change in dates (the web site states registration is open until 15 September) but our hands have been forced on this.

 

There are still a number of places available so please register quickly if you want to attend.  The more attendees we have the better chance we have of staging a European PowerShell Summit in 2015.


Source: Richard Siddaway

under: Uncategorized

Finding a file version

Posted by: | September 5, 2014 Comments Off on Finding a file version |

Interesting question on the forum – how to find the file version of IE on remote machines?

Get-CimInstance -ClassName CIM_DataFile -Filter “Name = ‘C:\Program Files\Internet Explorer\iexplore.exe’”  | select -ExpandProperty Version

Use the CIM_dataFile class.  Its one of the few CIM_ classes that doesn’t have a Win32_ equivalent.

In this case you know the path to the file – note the \ as you have to escape a single in WMI filters


Source: Richard Siddaway

under: Uncategorized

WMF 5.0 September 2014 preview now available

Posted by: | September 5, 2014 Comments Off on WMF 5.0 September 2014 preview now available |

Another preview for WMF 5.0, and PowerShell 5.0, is available for download.  Details from

 

http://blogs.msdn.com/b/powershell/archive/2014/09/04/windows-management-framework-5-0-preview-september-2014-is-now-available.aspx


Source: Richard Siddaway

under: Uncategorized

OneNote and XML–finding notebooks

Posted by: | September 4, 2014 Comments Off on OneNote and XML–finding notebooks |

When OneNote first came out there wasn’t an API for it as you get for Word or Excel. A community module enabled you to work with the XML that formed the OneNote note books but it wasn’t updated after Office 2007 and doesn’t really work with later versions of OneNote. 

I was looking at the Office developer site and noticed that there was some information on OneNote http://msdn.microsoft.com/en-us/library/office/jj680118(v=office.15).aspx.  This series will investigate how to script against OneNote and also expalin how to use Select-XML and XPath on the way.

A good starting point would be to discover the OneNote notebooks:

$onenote = New-Object -ComObject OneNote.Application
$scope = [Microsoft.Office.Interop.OneNote.HierarchyScope]::hsPages
[ref]$xml = ”

$onenote.GetHierarchy($null, $scope, $xml)

$schema = @{one=”http://schemas.microsoft.com/office/onenote/2013/onenote”}
$xpath = “//one:Notebook”
Select-Xml -Xml ([xml]$xml.Value) -Namespace $schema -XPath $xpath |
foreach {
$psitem.Node.Name
}

The starting point – like all good Office applications – is a COM object that exposes the OneNote object model.  As an aside isn’t time office moved away from COM and we had a proper .NET API or even better a PowerShell module.

You also need to define the scope – in this case get all pages. The enumeration is described here http://msdn.microsoft.com/en-us/library/office/jj680119(v=office.15).aspx

You also need to create a [ref] object to hold the output

The GetHierarchy() method is used to read through the notebooks. The $null argument means start at the top

The schema can be found inside the XML produced so to avoid a circular argument I’ll set that in a variable – it has to be a hash table as shown

Define the XPath – in this case get the nodes labelled one:Notebook

Select-XML will extract the required nodes – notice how the object has to be presented.

A simple foreacch iterates over the nodes which look like this

name             : Personal (Web)
nickname         : Personal (Web)
ID               : {F8CC78D5-9CC3-40C8-847B-96B15E3D6AD2}{1}{B0}
path             :
https://<a path>  (Web)/
lastModifiedTime : 2014-09-04T17:48:07.000Z
color            : #FFD869
Section          : {Quick Notes, Unfiled Notes, PowerShell Summit}
SectionGroup     : SectionGroup

And you can select the name of the notebook.


Source: Richard Siddaway

under: Uncategorized

Grains of rice on a chess board

Posted by: | August 29, 2014 Comments Off on Grains of rice on a chess board |

There is a story about the inventor of chess being rewarded by putting 1 grain of rice on the first square of the board; 2 on the second and so on.  How much rice does that come to?

 

The total number of grains is 1.84467440737096E+19

 

At 25mg per grain thats 461168601842739 kilogrammes of rice

 

Which in more understandable terms is:

 

461,168,601,842.739 metric tonnes

 

or

453,886,749,619.642 tons

 

That’s a lot of rice

 

If you want to play around with the numbers the calculations are:

 

[double]$result = 0

1..64 |
foreach {
 
$square = [math]::Pow(2, ($psitem -1))
$result += $square

}

$wt = 0.025

$totalweight = ($wt * $result)/1000
$totalweight

$mtwt = $totalweight /1000
$mtwt

$tons = $totalweight * 0.00098421
$tons


Source: Richard Siddaway

under: Uncategorized

Event Log Providers

Posted by: | August 29, 2014 Comments Off on Event Log Providers |

An event log provider is writes to an event log.  I’ve used WMI in the past to get these but while looking for somethign else discovered that Get-WinEvent can also find this information

 

Get-WinEvent -ListProvider * | ft Name, LogLinks -AutoSize –Wrap

 

Provides a nice long list of all of the providers and the event logs they write to.

 

Usually I’m only interested in what’s writing to a particular event log. And that’s where things get a bit more messy.

 

The loglinks are supplied as a System.Collections.Generic.IList[System.Diagnostics.Eventing.Reader.EventLogLink] LogLinks  object that doesn’t play nicely with –in or –contains

 

So we need a bit of PowerShell manipulation to get what we want

 

$log = ‘System’

Get-WinEvent -ListProvider * |
foreach {
 
if ($log -in ($psitem | select -ExpandProperty Loglinks | select -ExpandProperty Logname)){
    New-Object -TypeName psobject -Property @{
      Name = $psitem.Name
      Log = $log
    }
}
}

 

The trick here is that the loglinks are a collection of objects so you need to expand them twice to get to the name.  Not pretty but it works


Source: Richard Siddaway

under: Uncategorized

Patching Server Core

Posted by: | August 28, 2014 Comments Off on Patching Server Core |

I’ve been rebuilding my test lab after installing a SSD into the machine running it in place of the SATA drive.  Huge improvement in load speed of virtual machines – well worth the cost.

I usually have a number of server core machines in the lab and use WSUS for patching.  One issue I’d never really resolved was patching those server core machines  – the control panel fro Windows Update isn’t available!

Finally found a solution in the Windows Update PowerShell module from

http://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc

Install the module and then you can install your patches using

Get-WUInstall –AcceptAll

I’m running Windows 2012 R2 on all my servers so the modules auto load


Source: Richard Siddaway

under: Uncategorized

Older Posts »

Categories