6

如何在 PowerShell 中以 8.3 表示法显示目录列表?

4

5 回答 5

8

您可以使用 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
    }    
}
于 2013-06-08T15:51:32.047 回答
3

如果您安装PSCX模块,则您拥有Get-ShortPathcmdlet,您可以执行以下操作:

dir | Get-ShortPath

或者

 dir | Get-ShortPath  | select -expa shortpath
于 2013-06-08T09:03:17.160 回答
0

你引起了我的注意,这不是完整的答案,而是我帮助你的方式:

首先:看看如何在 Windows 2008 和 Windows 7 中控制 8dot3 命名

第二:这是使用 C# 将路径转换为 ​​Dos 8.3 表示法的解决方案,您可以在 PowerShell 中修改或使用它。

于 2013-06-08T05:14:32.680 回答
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. ScriptoPInvoke.net 。

于 2020-03-10T21:27:33.853 回答
0

你可以运行cmd...

cmd /c dir /x

请注意,get-childitem -filter 也匹配文件名的短版本!

get-childitem -filter *~1*
于 2019-11-05T18:25:13.337 回答