Functions/Get-LongName.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
function Get-LongName { <# .SYNOPSIS To get the longname of a provided shortname (8.3) of a file or folder .DESCRIPTION To get the longname of a provided shortname (8.3) of a file or folder. If the path resolves to 2 or more objects the function will generate an error .PARAMETER Path A string or string array of files and folders .PARAMETER IncludeInput Switch to include the input parameters in the output .EXAMPLE Get-LongName -Path C:\temp\THISIS~1.TXT C:\temp\This is a really long filename.txt .EXAMPLE Get-LongName -Path C:\temp\THISIS~1.TXT -IncludeInput ShortName LongName ItemType --------- -------- -------- C:\temp\THISIS~1.TXT C:\temp\This is a really long filename.txt File .EXAMPLE Get-LongName -Path C:\temp\REALLY~1 C:\temp\Really-long-folder-name .EXAMPLE Get-LongName -Path C:\temp\REALLY~1 -IncludeInput ShortName LongName ItemType --------- -------- -------- C:\temp\REALLY~1 C:\temp\Really-long-folder-name Folder .NOTES Inspired by https://devblogs.microsoft.com/scripting/use-powershell-to-display-short-file-and-folder-names/ Changes * allow for accepting the -Path from the pipeline * test for existence of path, if does not exist throw an error * resolve to list of paths and if it resolves to more than one throw an error * use get-item to determine if folder or file * use Scripting.FileSystemObject comobject to get the shortname of the item * if switch -IncludeInput output an object with the LongName, ShortName and ItemType (File or Folder) * updated function so Test-Path, Resolve-Path, Get-Item use -LiteralPath vs -Path .OUTPUTS [string[]] #> [CmdletBinding(ConfirmImpact = 'None', DefaultParameterSetName = 'Path')] param( [Parameter(ParameterSetName = 'Path', ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]] $Path, [Parameter(ParameterSetName = 'LiteralPath')] [ValidateScript({ if ($_ -notmatch '[\?\*]') { $true } else { throw 'Wildcard characters *, ? are not acceptable with -LiteralPath' } })] [string[]] $LiteralPath, [Parameter(ParameterSetName = 'Path')] [Parameter(ParameterSetName = 'LiteralPath')] [switch] $IncludeInput ) begin { Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]" Write-Verbose -Message "ParameterSetName [$($PsCmdlet.ParameterSetName)]" } process { switch ($PsCmdlet.ParameterSetName) { 'LiteralPath' { foreach ($curPath in $LiteralPath) { if (Test-Path -LiteralPath $curPath) { $Item = Get-Item -LiteralPath $curPath Write-Verbose -Message $Item.PSProvider if ($Item.PSProvider.ToString() -eq 'Microsoft.PowerShell.Core\FileSystem') { Write-Verbose -Message "Using item [$curPath]" $ReturnVal = $Item.Fullname if ($Item.PSIsContainer) { $ItemType = 'Folder' } else { $ItemType = 'File' } if ($IncludeInput) { New-Object -TypeName psobject -Property ([ordered] @{ ShortName = $curPath LongName = $ReturnVal ItemType = $ItemType }) } else { Write-Output -InputObject $ReturnVal } } else { Write-Error -Message 'Only works against filesystem objects' } } else { Write-Error -Message "ERROR: File [$curPath] does not exist" } } } 'Path' { foreach ($curPath in $Path) { if (Test-Path -Path $curPath) { $ResolveFile = Resolve-Path -Path $curPath foreach ($curResolve in $ResolveFile) { $Item = Get-Item -LiteralPath $curResolve.Path Write-Verbose -Message $Item.PSProvider.ToString() if ($Item.PSProvider.ToString() -eq 'Microsoft.PowerShell.Core\FileSystem') { Write-Verbose -Message "Using item [$curResolve]" $ReturnVal = $Item.Fullname if ($Item.PSIsContainer) { $ItemType = 'Folder' } else { $ItemType = 'File' } if ($IncludeInput) { New-Object -TypeName psobject -Property ([ordered] @{ ShortName = $Item LongName = $ReturnVal ItemType = $ItemType }) } else { Write-Output -InputObject $ReturnVal } } else { Write-Error -Message 'Only works against filesystem objects' } } } else { Write-Error -Message "ERROR: File [$curPath] does not exist" } } } } } end { Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]" } } |