As I said yesterday, PowerShell does have its warts. Here’s another oddball one:
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
PS C:\Users\Swoogan> $str = ""
PS C:\Users\Swoogan> $result = mkdir temp
PS C:\Users\Swoogan> $result
Directory: C:\Users\Swoogan
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 28/07/2014 7:11 PM temp
PS C:\Users\Swoogan> $out = $str.GetType(), $result
PS C:\Users\Swoogan> $out
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\Users\Swoogan\temp
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\Users\Swoogan
PSChildName : temp
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : True
Name : temp
Parent : Swoogan
Exists : True
Root : C:\
FullName : C:\Users\Swoogan\temp
Extension :
CreationTime : 28/07/2014 7:11:17 PM
CreationTimeUtc : 29/07/2014 1:11:17 AM
LastAccessTime : 28/07/2014 7:11:17 PM
LastAccessTimeUtc : 29/07/2014 1:11:17 AM
LastWriteTime : 28/07/2014 7:11:17 PM
LastWriteTimeUtc : 29/07/2014 1:11:17 AM
Attributes : Directory
BaseName : temp
Mode : d----
PS C:\Users\Swoogan>
If you output the System.IO.DirectoryInfo on it’s own, it uses one formatter; however, if you output it with a System.Object, then a different formatter is used. The real trouble is when you have this happen in a 100 line long script where the System.Object gets added to the pipeline on line 2 and the mkdir occurs on line 92. Your script’s output changes drastically because of some code 90 lines away.
You can prevent it by capturing the System.Object in a variable or piping it to Out-Null. If you actually want to output it, you can pipe to Out-Default. Although I’m not exactly sure why the later works.
All three options are a minor frustration as you basically have to do them all the time on the off chance something you’re doing now is going to change the output of the script somewhere down the road.
No comments:
Post a Comment