Obter caminho do DOS em vez do caminho do Windows

Em uma janela do DOS, como posso obter o nome completo do DOS / short do diretório em que estou?

Por exemplo, se eu estiver no diretório C:\Program Files\Java\jdk1.6.0_22 , quero exibir seu nome abreviado C:\PROGRA~1\Java\JDK16~1.0_2 .

Eu sei que correr dir /x vai me dar os nomes abreviados de arquivos / diretórios no diretório atual, mas eu não fui capaz de encontrar uma maneira de exibir o caminho completo do diretório atual no formato de nome curto. Eu estou tendo que trabalhar o meu caminho através do caminho da raiz, diretório por diretório, executando dir /x em cada.

Tenho certeza de que há uma maneira mais fácil de fazer isso?

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

Qualquer maneira mais simples?

Você também pode inserir o seguinte em uma janela do CMD:

 dir  /X 

Onde é substituído pelo caminho completo do diretório que contém o item para o qual você deseja o nome.

Embora a saída não seja tão simples quanto a resposta do Timbo , ela listará todos os itens no diretório especificado com o nome real e (se diferente) o nome abreviado.

Se você usar for %I in (.) do echo %~sI você pode replace o . com o caminho completo do arquivo / pasta para obter o nome abreviado daquele arquivo / pasta (caso contrário, o nome abreviado da pasta atual será retornado).

Testado no Windows 7 x64.

Nos scripts de lote do Windows, %~s1 expande os parâmetros de caminho para nomes abreviados . Crie este arquivo em lotes:

 @ECHO OFF echo %~s1 

Eu chamei o meu shortNamePath.cmd e chame assim:

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

Edit: aqui está uma versão que usa o diretório atual se nenhum parâmetro foi fornecido:

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

Chamado sem parâmetros:

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

Ser um programador fez este projeto Winform de 10 minutos. Tem sido útil para mim. Tornar este aplicativo em um menu de contexto para o explorador de arquivos economizaria mais cliques.

Aplicação de 10 minutos

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 { ///  /// Required designer variable. ///  private System.ComponentModel.IContainer components = null; ///  /// Clean up any resources being used. ///  /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code ///  /// Required method for Designer support - do not modify /// the contents of this method with the code editor. ///  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; } } 

execute cmd.exe e faça o seguinte:

 > cd "long path name" > command 

Então, o command.com aparecerá e exibirá apenas caminhos curtos.

fonte

A resposta da Kimbo é perfeita para arquivos normais.

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

Para nomes de arquivos MsDos em HardLinks

Os links mklink /H criados com mklink /H não terão um nome de arquivo curto MsDos.

No caso de você dir /X e descobrir que o nome abreviado ausente deve esperar o seguinte:

 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  . 03/02/2015 15:15  .. 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 

Arquivo normal

Nesse caso

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

Eu tenho o que eu esperava

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

Arquivo link duro

Nesse caso

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

Eu tenho o caminho normal MsDos, mas o nome do arquivo normal.

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

semelhante a esta resposta, mas usa uma sub-rotina

 @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 

Uma resposta mais direta é corrigir o bug.

% SPARK_HOME% \ bin \ spark-class2.cmd; Linha 54
Broken: set RUNNER="%JAVA_HOME%\bin\java"
Windows Style: set "RUNNER=%JAVA_HOME%\bin\java"

Caso contrário, o RUNNER termina com aspas e o comando "%RUNNER%" -Xmx128m ... termina com aspas duplas. O resultado é que o Programa e Arquivo são tratados como parâmetros separados.