如何在PowerShell中以8.3表示法显示目录列表?
答案 0 :(得分:6)
您可以使用WMI:
Get-ChildItem | ForEach-Object{
$class = if($_.PSIsContainer) {"Win32_Directory"} else {"CIM_DataFile"}
Get-WMIObject $class -Filter "Name = '$($_.FullName -replace '\\','\\')'" | Select-Object -ExpandProperty EightDotThreeFileName
}
或者是Scripting.FileSystemObject com对象:
$fso = New-Object -ComObject Scripting.FileSystemObject
Get-ChildItem | ForEach-Object{
if($_.PSIsContainer)
{
$fso.GetFolder($_.FullName).ShortPath
}
else
{
$fso.GetFile($_.FullName).ShortPath
}
}
答案 1 :(得分:3)
如果您安装PSCX模块,则拥有Get-ShortPath
cmdlet,您可以这样做:
dir | Get-ShortPath
或
dir | Get-ShortPath | select -expa shortpath
答案 2 :(得分:0)
你引起了我的注意,这不是完整的答案,而是我帮助你的方式:
首先:看看how to Control 8dot3 naming in Windows 2008 and Windows 7。
第二:这是Convert path to Dos 8.3 notation using C#的解决方案,您可以在PowerShell中修改或使用。
答案 3 :(得分:0)
您可以运行cmd ...
cmd /c dir /x
请注意,get-childitem -filter也与短文件名匹配!
get-childitem -filter *~1*
答案 4 :(得分:0)
基于jpblanc的答案,这是一种可以通过调用Win32 GetShortPathName() API来缩短整个路径的方法:
function Get-ShortPathName
{
Param([string] $path)
$MethodDefinition = @'
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, EntryPoint = "GetShortPathNameW", SetLastError = true)]
public static extern int GetShortPathName(string pathName, System.Text.StringBuilder shortName, int cbShortName);
'@
$Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name 'Kernel32' -Namespace 'Win32' -PassThru
$shortPath = New-Object System.Text.StringBuilder(500)
$retVal = $Kernel32::GetShortPathName($path, $shortPath, $shortPath.Capacity)
return $shortPath.ToString()
}
除了前面引用的链接外,我在编写此功能时还咨询了Dr. Scripto和PInvoke.net。