Obtenha o caminho do DOS em vez do caminho do Windows

99

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

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

Sei que a execução dir /xme dará os nomes curtos de arquivos / diretórios no diretório atual, mas não consegui encontrar uma maneira de exibir o caminho completo do diretório atual no formato de nome curto. Estou tendo que trabalhar meu caminho através do caminho da raiz, diretório por diretório, executando dir /xem cada um.

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

CodeClimber
fonte
2
O que há de errado em perguntar aqui? Existem centenas de perguntas marcadas com DOS ou MS-DOS.
CodeClimber
Talvez sejam questões de programação relacionadas a DOS ou MS_DOS?
Pascal Cuoq
1
Existem milhares de perguntas marcadas por e-mail ou vídeo, mas ainda não é o lugar para perguntar sobre, por exemplo, como anexar um vídeo a um e-mail ...
Guffa 29/10/10
1
Acho que é uma pergunta perfeitamente válida e não aprecio o voto negativo.
CodeClimber
12
Fico feliz que tenha sido perguntado aqui - a resposta abaixo me ajudou.
monojohnny

Respostas:

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

Alguma maneira mais simples?

Timbó
fonte
2
Isso é muito chato e útil.
elgabito
Ok, mas como incluir nomes de diretórios?
Marcos
3
Encontrei minha resposta: for /d %I in (*) do @echo %~sI todo segmento de caminho é curto, ótimo. O problema não foi diretamente com os nomes longos, nem mesmo os espaços, mas o pior é quando os personagens internacionais estão presentes, o que simplesmente mangueira meu script, tomando esta lista de dir como entrada.
Marcos
impressionante! Muito útil.
kulNinja
6
Se você estiver chamando isso de um script em lote, terá que escapar dos %sinais:for %%I in ("C:\folder with spaces") do echo %%~sI
Igor Popov
41

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

dir <ParentDirectory> /X

Onde <ParentDirectory>é substituído pelo caminho completo do diretório que contém o item cujo nome você deseja.

Enquanto a saída não é um simples como a resposta de Timbo , ele irá listar todos os itens no diretório especificado com o nome real e (se for diferente) o nome abreviado.

Se você usar, for %I in (.) do echo %~sIpoderá substituir o .pelo caminho completo do arquivo / pasta para obter o nome abreviado desse arquivo / pasta (caso contrário, o nome abreviado da pasta atual será retornado).

Testado em Windows 7 x64.

Trisped
fonte
29

Em scripts de lote do Windows, %~s1expande os parâmetros do caminho para nomes curtos . Crie este arquivo em lote:

@ECHO OFF
echo %~s1

Liguei para o meu shortNamePath.cmde chamo assim:

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

Editar: 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
gilly3
fonte
1
Uma maneira meticulosa de produzir um utilitário para uso futuro. Eu não poderia agradecer o suficiente por esta solução. Chamar tal comando a qualquer momento sem esforço é uma bênção.
Izzy Helianthus
Caso outro novato encontre esta solução inteligente: O script verifica se o primeiro parâmetro está vazio. Nesse caso, o script é executado novamente, mas desta vez com o diretório atual como o primeiro argumento ( %0é o nome do caminho do script em lote).
Sinjai
11

Ser um programador fez este projeto Winform de 10 minutos. Tem sido útil para mim. Tornar este aplicativo 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
    {
        /// <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;
    }
}
Tae-Sung Shin
fonte
1
Isso é um exagero de qualquer pessoa que queira trabalhar na linha de comando. Mas eu gosto de programas C #.
Eniola
Página MSDN para api: GetShortPathName
Amro
7

execute cmd.exee faça o seguinte:

> cd "long path name"
> command

Em seguida, command.com aparecerá e exibirá apenas caminhos curtos.

fonte

gulbrandr
fonte
18
O Windows 7 não tem command.com, pelo menos não na versão x64.
Timbó,
2
O procedimento acima funciona no Win7 de 32 bits - eu simplesmente fiz isso. Mas você está certo, não funciona em 64 bits (também testado).
cssyphus
2
nem no Windows 8 64bit
Dasun
5

A resposta de Kimbo é perfeita para arquivos normais.

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

Para nomes de arquivo MsDos em HardLinks

Os links mklink /H <link> <target>físicos criados com não terão um nome de arquivo curto MsDos.

No caso de você dir /Xe você descobrirem esse nome curto ausente, você 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    <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

Arquivo normal

Nesse caso

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

Eu tenho o que esperava

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

Arquivo de link físico

Nesse caso

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

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

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

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
ClearBlueSky85
fonte
1

Uma resposta mais direta é consertar 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 o Arquivo são tratados como parâmetros separados.

Steven Davis
fonte
0

se for por meio de um arquivo em lote, use:

set SHORT_DIR=%~dsp0%

você pode usar o comando echo para verificar:

echo %SHORT_DIR%
George
fonte