获取 DOS 路径而不是 Windows 路径

问题描述 投票:0回答:12

在 Windows CMD.exe 命令行中,如何获取我所在目录的完整 DOS 名称/短名称(也称为 8.3 格式)?

例如,如果我在目录

C:\Program Files\Java\jdk1.6.0_22
中,我想显示它的短名称
C:\PROGRA~1\Java\JDK16~1.0_2

我知道运行

dir /x
会给我当前目录中文件/目录的短名称,但我一直无法找到一种方法以短名称格式显示当前目录的完整路径。我必须从根目录开始,逐个目录地遍历路径,在每个目录中运行
dir /x

我确定有更简单的方法吗?

windows command-line
12个回答
173
投票
for %I in (.) do echo %~sI

还有更简单的方法吗?


45
投票

您还可以在 CMD 窗口中输入以下内容:

dir <ParentDirectory> /X

其中

<ParentDirectory>
替换为包含您想要名称的项目的目录的完整路径。

虽然输出不像 Timbo 的答案那么简单,但它将列出指定目录中的所有项目,并带有实际名称和(如果不同)短名称。

如果您确实使用

for %I in (.) do echo %~sI
,您可以将
.
替换为文件/文件夹的完整路径,以获取该文件/文件夹的短名称(否则返回当前文件夹的短名称)。

在 Windows 7 x64 上测试。


33
投票

在 Windows 批处理脚本中,

%~s1
将路径参数扩展为短名称。创建此批处理文件:

@echo %~s1

我给我的

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

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

编辑:这是一个在未提供参数的情况下使用当前目录的版本:

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

不带参数调用:

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

11
投票

作为一名程序员制作了这个 10 分钟的 Winform 项目。这对我很有用。将此应用程序设置为文件资源管理器的上下文菜单将节省更多点击次数。

Form1.cs:

using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace ToShortPath
{
    public partial class Form1 : Form
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern int GetShortPathName(
                 [MarshalAs(UnmanagedType.LPTStr)]
                   string path,
                 [MarshalAs(UnmanagedType.LPTStr)]
                   StringBuilder shortPath,
                 int shortPathLength
                 );
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Show the dialog and get result.
            var openFileDialog1 = new OpenFileDialog();
            DialogResult result = openFileDialog1.ShowDialog();
            if (result == DialogResult.OK) // Test result.
            {
                textBox1.Text = openFileDialog1.FileName;
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            var openFileDialog1 = new FolderBrowserDialog();
            DialogResult result = openFileDialog1.ShowDialog();
            if (result == DialogResult.OK) // Test result.
            {
                textBox1.Text = openFileDialog1.SelectedPath;
            }

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            StringBuilder shortPath = new StringBuilder(65000);
            GetShortPathName(textBox1.Text, shortPath, shortPath.Capacity);
            textBox2.Text = shortPath.ToString();
        }

    }
}

Form1.Designer.cs:

namespace ToShortPath
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.textBox2 = new System.Windows.Forms.TextBox();
            this.label1 = new System.Windows.Forms.Label();
            this.label2 = new System.Windows.Forms.Label();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(69, 13);
            this.textBox1.Multiline = true;
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(516, 53);
            this.textBox1.TabIndex = 0;
            this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
            // 
            // textBox2
            // 
            this.textBox2.Location = new System.Drawing.Point(69, 72);
            this.textBox2.Multiline = true;
            this.textBox2.Name = "textBox2";
            this.textBox2.ReadOnly = true;
            this.textBox2.Size = new System.Drawing.Size(516, 53);
            this.textBox2.TabIndex = 1;
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(7, 35);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(56, 13);
            this.label1.TabIndex = 2;
            this.label1.Text = "Long Path";
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(7, 95);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(57, 13);
            this.label2.TabIndex = 3;
            this.label2.Text = "Short Path";
            // 
            // button1
            // 
            this.button1.AutoSize = true;
            this.button1.Location = new System.Drawing.Point(591, 13);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(40, 53);
            this.button1.TabIndex = 4;
            this.button1.Text = "File";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // button2
            // 
            this.button2.AutoSize = true;
            this.button2.Location = new System.Drawing.Point(637, 12);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(46, 53);
            this.button2.TabIndex = 5;
            this.button2.Text = "Folder";
            this.button2.UseVisualStyleBackColor = true;
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(687, 135);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.textBox2);
            this.Controls.Add(this.textBox1);
            this.Name = "Form1";
            this.Text = "Short Path";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.TextBox textBox2;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
    }
}

6
投票

运行

cmd.exe
并执行以下操作:

> cd "long path name"
> command

然后 command.com 将出现并仅显示短路径。

来源


5
投票

Kimbo 的答案对于普通文件来说是完美的。

for %I in (.) do echo %~sI

对于硬链接上的 MsDos 文件名

使用

mklink /H <link> <target>
创建的硬链接不会有 MsDos 短文件名。

如果您

dir /X
并且发现缺少简称,您应该期待以下内容:

d:\personal\photos-tofix\2013-proposed1-bad>dir /X
 Volume in drive D has no label.
 Volume Serial Number is 7C7E-04BA

 Directory of d:\personal\photos-tofix\2013-proposed1-bad

03/02/2015  15:15    <DIR>                       .
03/02/2015  15:15    <DIR>                       ..
22/12/2013  12:10         1,948,654 2013-1~1.JPG 2013-12-22--12-10-42------Bulevardul-Petrochimiștilor.jpg
22/12/2013  12:10         1,899,739              2013-12-22--12-10-52------Bulevardul Petrochimiștilor.jpg

普通文件

在这种情况下

> for %I in ("2013-12-22--12-10-42------Bulevardul-Petrochimiștilor.jpg") do echo %~sI

我得到了我想要的

d:\personal\PH124E~1\2013-P~3\2013-1~1.JPG

硬链接文件

在这种情况下

> for %I in ("2013-12-22--12-10-52------Bulevardul-Petrochimiștilor.jpg") do echo %~sI

我有正常的 MsDos 路径,但有正常的文件名。

d:\personal\PH124E~1\2013-P~3\2013-12-22--12-10-52------Bulevardul-Petrochimiștilor.jpg`

2
投票

有人更直接的答案是修复错误。

%SPARK_HOME% in\spark-class2.cmd; 54号线

Broken: set RUNNER="%JAVA_HOME%\bin\java"

Windows Style: set "RUNNER=%JAVA_HOME%\bin\java"

否则,RUNNER 会以引号结束,并且命令

"%RUNNER%" -Xmx128m ...
以双引号结束。结果是程序和文件被视为单独的参数。


1
投票

与此answer类似,但使用子例程

@echo off
CLS

:: my code goes here
set "my_variable=C:\Program Files (x86)\Microsoft Office"

echo %my_variable%

call :_sub_Short_Path "%my_variable%"
set "my_variable=%_s_Short_Path%"

echo %my_variable%

:: rest of my code goes here
goto EOF

:_sub_Short_Path
set _s_Short_Path=%~s1
EXIT /b

:EOF

1
投票
$fso = New-Object -com scripting.filesystemobject
$fso.GetFolder('c:\Program Files (x86)').ShortName()

PROGRA~2

受到 Scripto 博士的回答的启发


1
投票

如果通过批处理文件使用:

set SHORT_DIR=%~dsp0%

可以使用echo命令来检查:

echo %SHORT_DIR%

0
投票

将此脚本放置在 Windows 路径中的某个位置。我调用了我的

getshort.bat
并将其放在System32文件夹中。

要使用此功能,您必须在 cmd.exe 窗口中调用脚本后传递单个路径参数。

因此,打开 cmd.exe 并输入类似

getshort.bat "C:\folder\file name with spaces.ext"
的内容,您必须用空格双引号路径,否则没有必要。

该脚本将采用您提供的路径并将短名称存储在具有两个版本的临时文本文件中,版本 1 在短路径周围有引号,而另一个版本则没有。

我使用记事本++打开txt文件,因此如果您不使用该程序,您需要更改行

START "" /MAX NOTEPAD++ "%TMP%\Test.txt"
并将
notepad++
替换为您的编辑器名称。

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
COLOR 0A

:----------------------------------------------------------------------------------

REM SET THE CD VARIABLE EQUAL TO THE FIRST PARAMATER YOU PASSED THE SCRIPT
:: ..WHICH WAS A FILE PATH OF YOUR CHOOSING...
CD=%1

:----------------------------------------------------------------------------------

:: DELETE ANY LEFTOVERS FROM PRIOR RUNS
IF EXIST "%TMP%\Test.txt" DEL /F /Q "%TMP%\Test.txt"

:----------------------------------------------------------------------------------

:: USE THE FOR COMMAND TO CALL A SUBROUTINE TO STORE THE SHORT NAMES WITH AND WITHOUT QUOTES
FOR %%1 IN ("%CD%") DO (
    SET ARG1="%%~s1"
    SET ARG2=%%~s1
    CALL :CREATE_TXTFILE ARG1 ARG2
    START "" /MAX NOTEPAD++ "%TMP%\Test.txt"
    GOTO :EOF
)

:----------------------------------------------------------------------------------

REM USE THIS SUB-ROUTINE TO STORE THE SHORTNAMES INSIDE THE A TXT FILE
:CREATE_TXTFILE
(
ECHO %ARG1%
ECHO %ARG2%
)>"%TMP%\Test.txt"
:: THE NEXT LINE WILL RETURN THE SCRIPT TO THE LINE BELOW THE CALL COMMAND ABOVE AND CONTINUE EXECUUTION AS NORMAL
:: NOTEPAD++ WILL ATTEMPT TO FIND AND OPEN THE NEWLY CREATED TXT FILE WITH THE SHORTNAMES INSIDE
:: CHANGE TO WHATEVER TEXT EDITOR YOU HAVE TO OPEN TXT FILES IF YOU DONT HAVE NOTEPAD++
EXIT /B

-4
投票

使用此链接,它会自动将您提供的任何路径转换为任何格式 https://pathconverter-pp.azurewebsites.net

© www.soinside.com 2019 - 2024. All rights reserved.