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?


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?


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.


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

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

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


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`

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

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.



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%

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.