获取DOSpath而不是Windowspath

在DOS窗口中,如何获得我所在的目录的完整DOS名称/短名称?

例如,如果我在目录C:\Program Files\Java\jdk1.6.0_22 ,我想要显示它的简称C:\PROGRA~1\Java\JDK16~1.0_2

我知道运行dir /x会给我在当前目录中的文件/目录的短名称,但我一直没能find一种方式来显示短名称格式的当前目录的完整path。 我不得不通过从根目录,目录目录,每个运行dir /x的path。

我相信有一个更简单的方法来做到这一点?

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

任何更简单的方法?

您也可以在CMD窗口中input以下内容:

 dir <ParentDirectory> /X 

其中<ParentDirectory>被包含您想要的名称的项目的目录的完整pathreplace。

虽然Timbo的回答并不简单,但它会列出指定目录中的所有项目的实际名称和(如果不同)短名称。

如果你for %I in (.) do echo %~sI使用for %I in (.) do echo %~sI你可以replacefor %I in (.) do echo %~sI . 用文件/文件夹的完整path获取该文件/文件夹的短名称(否则返回当前文件夹的短名称)。

testing在Windows 7 x64上。

在windows批处理脚本中, %~s1将path参数扩展为短名称 。 创build这个batch file:

 @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 

运行cmd.exe并执行以下操作:

 > cd "long path name" > command 

那么command.com将会出现,只显示短path。

资源

作为程序员做了这个10分钟的Winform项目。 这对我有用。 使这个应用程序的文件资源pipe理器的上下文菜单将节省更多的点击。

10分钟的申请

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; } } 

Kimbo的答案非常适合普通文件。

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

对于HardLinks上的MsDos文件名称

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

如果你的dir /X ,你发现缺less短名称,你应该期待以下几点:

 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 

我有正常的MsDospath,但正常的文件名。

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

类似于这个答案,但是使用了一个子程序

 @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 

更直接的答案是解决这个错误。

%SPARK_HOME%\ bin中\火花class2.cmd; 54号线
Broken: set RUNNER="%JAVA_HOME%\bin\java"
Windows Style: set "RUNNER=%JAVA_HOME%\bin\java"

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