Get-ChildItem相当于DIR / X.

时间:2013-06-08 02:13:46

标签: powershell dos powershell-v3.0

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

5 个答案:

答案 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. ScriptoPInvoke.net