Obtener la ruta de DOS en lugar de la ruta de Windows

99

En una ventana de DOS, ¿cómo puedo obtener el nombre completo de DOS / el nombre corto del directorio en el que estoy?

Por ejemplo, si estoy en el directorio C:\Program Files\Java\jdk1.6.0_22, quiero mostrar su nombre corto C:\PROGRA~1\Java\JDK16~1.0_2.

Sé que la ejecución dir /xme dará los nombres cortos de los archivos / directorios en el directorio actual, pero no he podido encontrar una manera de mostrar la ruta completa del directorio actual en formato de nombre corto. Tengo que abrirme paso a través de la ruta desde la raíz, directorio por directorio, ejecutándose dir /xen cada uno.

Estoy seguro de que hay una forma más fácil de hacer esto.

CodeClimber
fuente
2
¿Qué tiene de malo preguntarlo aquí? Hay cientos de preguntas etiquetadas con DOS o MS-DOS.
CodeClimber
¿Quizás son cuestiones de programación relacionadas con DOS o MS_DOS?
Pascal Cuoq
1
Hay miles de preguntas etiquetadas por correo electrónico o video, pero este todavía no es el lugar para preguntar, por ejemplo, cómo adjuntar un video a un correo electrónico ...
Guffa
1
Creo que es una pregunta perfectamente válida y no aprecio el voto negativo.
CodeClimber
12
Me alegro de que se haya preguntado aquí; la respuesta a continuación me ayudó.
monojohnny

Respuestas:

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

¿Alguna forma más sencilla?

Timbo
fuente
2
Esto es muy poco convincente y útil.
elgabito
Está bien, pero ¿cómo hacer que incluya nombres de directorio?
Marcos
3
Encontré mi respuesta: for /d %I in (*) do @echo %~sI cada segmento de la ruta es corto, genial. El problema no fue directamente con los nombres largos, ni siquiera con los espacios, aunque un dolor, pero lo peor es cuando hay caracteres internacionales presentes que simplemente manchan mi script tomando esta lista de directorios como entrada.
Marcos
¡increíble! Muy útil.
kulNinja
6
Si llama a esto desde un script por lotes, debe escapar de los %signos:for %%I in ("C:\folder with spaces") do echo %%~sI
Igor Popov
41

También puede ingresar lo siguiente en una ventana de CMD:

dir <ParentDirectory> /X

Donde <ParentDirectory>se reemplaza por la ruta completa del directorio que contiene el elemento cuyo nombre desea.

Si bien la salida no es tan simple como la respuesta de Timbo , enumerará todos los elementos en el directorio especificado con el nombre real y (si es diferente) el nombre corto.

Si lo usa for %I in (.) do echo %~sI, puede reemplazar el .con la ruta completa del archivo / carpeta para obtener el nombre corto de ese archivo / carpeta (de lo contrario, se devuelve el nombre corto de la carpeta actual).

Probado en Windows 7 x64.

Trisped
fuente
29

En los scripts por lotes de Windows, %~s1expande los parámetros de ruta a nombres cortos . Cree este archivo por lotes:

@ECHO OFF
echo %~s1

Llamé al mío shortNamePath.cmdy lo llamo así:

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

Editar: aquí hay una versión que usa el directorio actual si no se proporcionó ningún parámetro:

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

Llamado sin parámetros:

C:\Program Files (x86)\Android\android-sdk>shortNamePath
C:\PROGRA~2\Android\ANDROI~1
gilly3
fuente
1
Una forma meticulosa de producir una utilidad para uso futuro. No podría agradecerles lo suficiente por esta solución. Llamar tal comando en cualquier momento sin esfuerzo es una bendición.
Izzy Helianthus
En caso de que otro novato se encuentre con esta inteligente solución: el script comprueba si el primer parámetro está vacío. Si es así, el script se ejecuta de nuevo, pero esta vez con el directorio actual como primer argumento ( %0es el nombre de la ruta del script por lotes).
Sinjai
11

Ser programador hizo este proyecto Winform de 10 minutos. Me ha resultado útil. Convertir esta aplicación en un menú contextual para el explorador de archivos ahorraría más clics.

Aplicación 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
fuente
1
Esto es una exageración para cualquiera que quiera trabajar desde la línea de comandos. Pero me gustan los programas de C #.
Eniola
Página de MSDN para api: GetShortPathName
Amro
7

ejecutar cmd.exey hacer lo siguiente:

> cd "long path name"
> command

Entonces aparecerá command.com y mostrará solo rutas cortas.

fuente

gulbrandr
fuente
18
Windows 7 no tiene command.com, al menos no en la versión x64.
Timbo
2
Lo anterior funciona en Win7 32bit, lo acabo de hacer. Pero tienes razón, no funciona en 64 bits (también probado).
cssyphus
2
ni en Windows 8 64bit
Dasun
5

La respuesta de Kimbo es perfecta para archivos normales.

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

Para nombres de archivo MsDos en HardLinks

Los enlaces duros creados con mklink /H <link> <target> físicos no tendrán un nombre de archivo corto MsDos.

En caso de que usted dir /Xy usted descubran que falta un nombre corto, deben esperar lo siguiente:

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

Archivo normal

En este caso

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

Tengo lo que esperaba

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

Archivo de vínculo físico

En este caso

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

Tengo la ruta normal de MsDos pero el nombre de archivo normal.

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

similar a esta respuesta pero usa una subrutina

@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
fuente
1

Una respuesta más directa para alguien es arreglar el error.

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

De lo contrario, el RUNNER termina con comillas y el comando "%RUNNER%" -Xmx128m ... termina con comillas dobles. El resultado es que el programa y el archivo se tratan como parámetros separados.

Steven Davis
fuente
0

si a través de un archivo por lotes use:

set SHORT_DIR=%~dsp0%

puede usar el comando echo para verificar:

echo %SHORT_DIR%
Jorge
fuente