Edit: I was caught speeding when I put up this post. Move-Item will pick up on SupportsShouldProcess and handle the –Whatif and –Confirm without having to supply the $Pscmdlet.SupportsShouldProcess(). In fact, adding this to a cmdlet that already supports it natively will throw up 2 prompts with –Confirm instead of 1. –WhatIf will only display once.
You should still be mindful of what you are doing with this in the case of cmdlets and other things you are doing which may not have native support for this. Rather than completely re-writing this post, it will stand to show that no one here is perfect and we are learn from one another as well as make mistakes !
While reviewing and voting on the entries for Event 1, I have been seeing some entries where they have the following:
[cmdletbinding(SupportsShouldProcess=$True)]
Ok, great! They are going to implement –WhatIf and –Confirm with their function so the user can take advantage of those parameters. But what I see later is rather disheartening.
Move-Item -Source $Source -Destination $Destination
Ok, this is just an example, but does represent exactly what I see and what you are seeing as well: Nothing has been implemented to support the SupportsShouldProcess attribute that was defined earlier!
Truth be told, it is incredibly simple to implement this into your code. Take a look below:
Function Move-LogFile { [cmdletbinding(SupportsShouldProcess)] Param ( $File, $Destination ) If ($Pscmdlet.ShouldProcess($File,"Move Item")) { Move-Item -Path $File -Destination $Destination } }
Again, very basic function to prove the point of implementing –WhatIf. Just use an If statement with the $Pscmdlet.ShouldProcess() method and supply the ‘Target’ and an ‘Action’ parameter and you have just successfully set up the –WhatIf support.
Move-LogFile -File "SomeLogFile.log" -Destination "C:\Backup" -WhatIf
Very simple to implement and it will save you from being docked points for only having this half done.
Hey Boe! Nice Article and thanks for your useful articles!!
My question is: Is there a way to find if a cmdlet support natively SupportsShouldProcess ?
I submit my script for the Advanced track and just adding [CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact=”Medium”)] allows to use confirm and whatif. Is there something I don’t get ?
http://www.lazywinadmin.com/2013/04/scripting-games-2013-advanced-event-1.html
Thanks for your help
Actually found a way using: Get-Command -CommandType Cmdlet -ParameterName Confirm
That is great! Same technique I was going to use as well, but I don’t usually get a chance to respond to comments on my blog until the evening.
SupportsShouldProcess will work fine with Move-Item and New-Item if the $ConfirmPreference is set to ‘Low’ or maybe ‘Medium’ (not sure what New/Move-Item cmdlets default to), but certainly works without the $PSCmdlet.ShouldProcess call if you just include the -Confirm parameter; I’m curious, do you get double prompted if you include the -Confirm parameter when calling your script, once by your script, and once by New/Move-Item?
You are absolutely correct! Move-Item does natively support the SupportsShouldProcess attribute and will in fact double prompt you for -Confirm if used with Move-Item. I will update this article to reflect that and use a better example for this.
Thanks for the comment!