web-dev-qa-db-fra.com

Obtenir le chemin DOS au lieu du chemin Windows

Dans une fenêtre DOS, comment puis-je obtenir le nom DOS complet/le nom abrégé du répertoire dans lequel je me trouve?

Par exemple, si je suis dans le répertoire C:\Program Files\Java\jdk1.6.0_22, Je veux afficher son nom abrégé C:\PROGRA~1\Java\JDK16~1.0_2.

Je sais courir dir /x me donnera les noms abrégés des fichiers/répertoires du répertoire actuel, mais je n’ai pas trouvé le moyen d’afficher le chemin complet du répertoire actuel sous forme de nom abrégé. Je dois parcourir le chemin depuis la racine, répertoire par répertoire, en cours d'exécution dir /x dans chaque.

Je suis sûr qu'il y a un moyen plus facile de faire ça?

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

Un moyen plus simple?

149
Timbo

Vous pouvez également entrer les informations suivantes dans une fenêtre CMD:

dir <ParentDirectory> /X

<ParentDirectory> Est remplacé par le chemin complet du répertoire contenant l'élément pour lequel vous souhaitez attribuer un nom.

Bien que la sortie ne soit pas aussi simple que réponse de Timbo , elle répertorie tous les éléments du répertoire spécifié avec le nom réel et (s’il est différent) le nom abrégé.

Si vous utilisez for %I in (.) do echo %~sI, vous pouvez remplacer le . Par le chemin complet du fichier/dossier pour obtenir le nom abrégé de ce fichier/dossier (sinon, le nom abrégé du dossier actuel est revenu).

Testé sur Windows 7 x64.

39
Trisped

Dans les scripts batch de Windows, %~s1 étend les paramètres de chemin aux noms abrégés . Créez ce fichier batch:

@ECHO OFF
echo %~s1

J'ai appelé le mien shortNamePath.cmd et appelez ça comme ça:

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

Edit: voici une version qui utilise le répertoire actuel si aucun paramètre n'a été fourni:

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

Appelé sans paramètres:

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

Être un programmeur a fait ce projet Winform de 10 minutes. Cela m'a été utile. Faire de cette application un menu contextuel pour l'explorateur de fichiers éviterait davantage de clics.

10-minute application

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;
    }
}
10
Tae-Sung Shin

courir cmd.exe et procédez comme suit:

> cd "long path name"
> command

Ensuite, command.com apparaîtra et n’affichera que des chemins courts.

source

7
gulbrandr

La réponse de Kimbo est parfaite pour les fichiers normaux.

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

Pour les noms de fichier MsDos sur HardLinks

Les liens durs créés avec mklink /H <link> <target> n'aura pas de nom de fichier court MsDos.

Au cas où vous dir /X et vous découvrez ce nom abrégé manquant, vous devez vous attendre aux éléments suivants:

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

Fichier normal

Dans ce cas

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

J'ai ce que j'attendais

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

Fichier de lien dur

Dans ce cas

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

J'ai le chemin normal de MsDos mais le nom de fichier normal.

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

Une réponse plus directe est de corriger le bogue.

% SPARK_HOME%\bin\spark-class2.cmd; Ligne 54
Broken: set RUNNER="%Java_HOME%\bin\Java"
Windows Style: set "RUNNER=%Java_HOME%\bin\Java"

Sinon, le RUNNER se termine par des guillemets et la commande "%RUNNER%" -Xmx128m ... se termine par des guillemets doubles. Le résultat est que le programme et le fichier sont traités comme des paramètres distincts.

1
Steven Davis

semblable à ceci réponse mais utilise une sous-routine

@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
0
ClearBlueSky85