如何找到Windows目录/文件的短路径?


73

我需要为正在使用的应用程序使用缩短的路径名。例如我需要C:\PROGRA~1\反对C:\Program Files。该程序无法处理空格,也不接受带引号的路径(例如"C:\Program Files")。

如果有帮助,我正在使用Windows7。如有必要,我可以访问XP以后的任何版本。

Answers:


77

单击开始,然后cmd在运行框中键入。启动cmd,并用于cd进入您感兴趣的文件夹:

cd \

然后

dir /x

C:\>dir /x

13/10/2011  09:14 AM    <DIR>          DOCUME~1     Documents and Settings
13/10/2011  09:05 AM    <DIR>          PROGRA~1     Program Files

因此,您对路径中的每个子文件夹都执行此操作吗?
endolith

@endolith /s开关执行子文件夹递归
Paul

1
我的意思是您如何显示整个8.3路径?
endlith

4
@Paul这似乎在Win10中不起作用。有任何想法吗?
AHungerArtist '17

3
@AHungerArtist短文件名不一定存在。他们的创作可以被关闭。
Hipponax43 '17

37

在一些方便的目录中创建一个bat文件,然后可以从该路径复制并粘贴短路径。

您也可以只运行command.com并继续cd对当前目录执行命令。

在Windows批处理脚本中,%~s1将路径参数扩展为short name。创建此批处理文件:

@ECHO OFF
echo %~s1

我打电话给我,shortNamePath.cmd并这样称呼它:

C:\> shortNamePath "c:\Program Files (x86)\Android\android-sdk"
c:\PROGRA~2\Android\ANDROI~1

如果没有提供任何参数,这是使用当前目录的版本:

@ECHO OFF
if '%1'=='' (%0 .) else echo %~s1

调用时不带参数:

C:\Program Files (x86)\Android\android-sdk> shortNamePath
C:\PROGRA~2\Android\ANDROI~1

使用SET和命名变量

Windows命令提示符具有一些约定,用于处理变量值中带有空格的约定,这些约定很难理解和理解,特别是如果您具有Unix背景。你可以做

SET TESTPATH=c:\Program Files (x86)\Android\android-sdk

不带引号),或

SET "TESTPATH=c:\Program Files (x86)\Android\android-sdk"

(请注意引号的非直观放置);然后

CALL :testargs "%TESTPATH%"
        ︙

:testargs
echo %~s1
goto :eof

6
真的很有用,应该标记为答案!
lucaferrario 2015年

谢谢!使用SET命令可以吗?像SET AAA = C:\ program files \ what \\中间的另一个空格\到短版本
Li3ro

@ Li3ro我无法弄清楚SET变量的命令方式,但是我已经很接近了,您可以在答案的底部看到它,只需要一点点修复即可。我不喜欢批处理脚本编程,所以我不知道怎么做。
SSpoke

这样是不可能的。您需要为此使用for循环
Li3ro 2015年

这比公认的答案更有用
EvilTeach

8

这是一个班轮

cmd /c for %A in ("C:\Program Files") do @echo %~sA

细目

  • cmd /c -启动Windows命令解释器的新实例,执行字符串指定的命令,然后终止
  • for %%parameter in (set) do 命令-有条件地多次执行命令。
  • echo-在屏幕上显示消息。@符号与ECHO OFF仅应用于当前行的符号相同。
  • %~s -扩展路径仅包含短名称。

资料来源


1
很好!!! 您可以将“ C:\ Program Files”替换为。获取当前目录的简称
Andrew Steitz'Sep

1
什么时候/为什么需要cmd /c?如果在“命令提示符”窗口中,则只需键入for %A in ("C:\Program Files") do @echo %~sA命令,然后在“运行”对话框中键入该命令,结果就会消失,然后才能读取。
斯科特,

2
做得很好; 作为@Scott指出,你不需要cmd /c运行时cmd; 您确实需要从PowerShell中获取它,但随后还需要'...'/ccmd /c 'for %f in ("C:\Program Files") do @echo %~sf'
括起来

8

“短名称”实际上是旧的DOS 8.3命名约定,因此所有目录都是前6个字母,然后~1假设只有一个名称与之匹配,例如:

C:\ABCDEF~1    - C:\ABCDEFG I AM DIRECTORY
C:\BCDEFG~1    - C:\BCDEFGHIJKL M Another Directory

这是唯一的例外

C:\ABCDEF~1    - C:\ABCDEFG I AM DIRECTORY
C:\ABCDEF~2    - C:\ABCDEFGHI Directory as well

6
不对。有时使用的字符较少,尤其是在使用亚洲字符(例如韩语)的情况下。
Arafangion

1
我想找出哪个是哪个在“例外”情况下的问题点-特别是作为“例外”定期在每个Windows 64位安装时,您可能需要知道哪一个出来的Program FilesProgram Files (x86)PROGRA~1和一个是PROGRA~2保罗的答案解决了这个问题。
OR Mapper 2014年

2
我有很多文件都以相同的字符开头,而在其中四个字符(...~4)之后以类似哈希的开头,例如ABxxxx~1x是十六进制的-很难读懂。
Sirap 2014年

2
您是否建议用户可以通过查看长名称来逻辑地找出短名称?这不是真的。如果创建ABCDEFGH-CAT,则将其简称ABCDEF~1。如果再创建ABCDEFGH-DOG,它将得到简称ABCDEF~2。如果我再删除ABCDEFGH-CATABCDEFGH-DOG仍然有短名ABCDEF~2。仅通过查看长名称就无法分辨。
斯科特,

如前所述,简称不必是6个首字母加号~1。请参阅Windows用于生成短名称的规则。您也可以使用手动设置简称fsutil,因此这两个名称可能没有任何关系。更不用说硬链接或软链接了
phuclv

4

如果安装了Powershell,我发现一种非常方便的方法来解决当前目录(或其他任何内容)的短路径名。

只需在当前目录中打开powershell

  • 在cmd Windows类型的Powershell中

  • 如果您在gui中打开了文件夹,则可以直接在文件夹的地址栏中键入cmd.exe或powershell.exe。

然后发出命令

(New-Object -ComObject Scripting.FileSystemObject).GetFolder(".").ShortPath

信息来源:[ https://gallery.technet.microsoft.com/scriptcenter/Get-ShortName-90a49303]


3

与Ivan Schwartz的答案类似,您可以将“ C:\ Program Files”替换%cd%为以获取当前目录:

cmd /c for %A in ("%cd%") do @echo %~sA  

0

另外,您也可以使用这个很棒的小工具PathCopyCopy

只需单击几下,您便可以从上下文菜单中获得几乎任何文件夹的长路径和短路径,例如:

右键单击目标文件夹=>路径副本=>短路径。

做完了 它将被复制到剪贴板。

预习


0

我已经通过npm install在样板上运行安装了节点模块。在尝试删除这些文件夹时,Windows不允许我们删除它们,因为路径太长而无法处理。

经过一些深入的研究后,我认为将自己的文件夹从根目录重命名为叶子目录是正确的,这样它也将引发任何违规异常。

这个对我有用。以下是C#项目的代码。

    public static int directoryCounterIndex = 0;
    public static void Main(string[] args)
    {
        string dirPath = @"D:\Studies\MeanStack\a\nodem";
        RenameDirectories(dirPath);
    }

    private static void RenameDirectories(string dirPath)
    {
        directoryCounterIndex += 1;
        var newPath = Path.GetDirectoryName(dirPath) + Path.DirectorySeparatorChar + directoryCounterIndex.ToString();
        Directory.Move(dirPath, newPath);
        var subDirectories = Directory.GetDirectories(newPath);
        foreach (var subDirectory in subDirectories)
        {
            RenameDirectories(subDirectory);
        }
    }

3
请仔细阅读问题。您的答案没有回答原始问题。
DavidPostill

0
C:\Users\abcd>subst z: "c:\Program Files (x86)\Microsoft Office365 Tools\Microsoft Visual Studio 14.0"

C:\Users\abcd>subst
Z:\: => C:\Program Files (x86)\Microsoft Office365 Tools\Microsoft Visual Studio 14.0"

这是我处理带空格的文件时最简单的方法,并且可以从文件资源管理器访问它,它也具有所有相同的访问权限。


-2

只需将空格替换为

%20

这是事物“翻译”的方式,空格进入%20。

如果您确实需要大量,只需打开浏览器并输入类似

test ";($#< and find the word test, and see that the space is %20 and so on...

我不认为你是对的。这不会产生积极的结果:if exist C:\Program%20Files\ (echo exists)
kayleeFrye_onDeck

3
您正在谈论的是完全不同的东西。要点是目录和文件名被截断为8个字符。浏览器与此无关。
戴维德·费伦茨·罗戈扬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.