110 votes

Obtenir le chemin DOS au lieu du chemin Windows

Dans une fenêtre DOS, comment puis-je obtenir le nom DOS complet/le nom court 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 court. C:\PROGRA~1\Java\JDK16~1.0_2 .

Je sais que courir dir /x me donnera les noms courts des fichiers/répertoires dans le répertoire actuel mais je n'ai pas réussi à trouver un moyen d'afficher le chemin complet du répertoire actuel au format des noms courts. Je dois me frayer un chemin à partir de la racine, répertoire par répertoire, en exécutant les commandes suivantes dir /x dans chaque.

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

2 votes

Qu'y a-t-il de mal à la poser ici ? Il y a des centaines de questions étiquetées DOS ou MS-DOS.

0 votes

Peut-être s'agit-il de questions de programmation liées à DOS ou MS_DOS ?

1 votes

Il y a des milliers de questions étiquetées email ou vidéo, mais ce n'est toujours pas l'endroit pour demander, par exemple, comment joindre une vidéo à un email...

170voto

Timbo Points 14117
for %I in (.) do echo %~sI

Y a-t-il un moyen plus simple ?

3 votes

C'est très nul, et utile.

0 votes

D'accord, mais comment faire en sorte qu'il inclue les noms des répertoires ?

4 votes

J'ai trouvé ma réponse : for /d %I in (*) do @echo %~sI Chaque segment de chemin est court, super. Le problème n'était pas directement avec les longs noms, ni même avec les espaces, bien que ce soit une douleur, mais le pire c'est quand les caractères internationaux sont présents, ce qui fait tout simplement échouer mon script qui prend cette liste de répertoires comme entrée.

45voto

Trisped Points 2571

Vous pouvez également saisir la commande suivante dans une fenêtre CMD :

dir <ParentDirectory> /X

<ParentDirectory> est remplacé par le chemin complet du répertoire contenant l'élément dont vous souhaitez obtenir le nom.

Bien que le résultat ne soit pas aussi simple que La réponse de Timbo il listera tous les éléments du répertoire spécifié avec le nom réel et (si différent) le nom court.

Si vous utilisez for %I in (.) do echo %~sI vous pouvez remplacer le . avec le chemin complet du fichier/dossier pour obtenir le nom court de ce fichier/dossier (sinon le nom court du dossier courant est retourné).

Testé sur Windows 7 x64.

31voto

gilly3 Points 33285

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

@ECHO OFF
echo %~s1

J'ai appelé le mien shortNamePath.cmd et l'appeler 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 courant 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

1 votes

Une façon méticuleuse de produire un utilitaire pour une utilisation future. Je ne pourrais jamais assez vous remercier pour cette solution. Appeler une telle commande à tout moment et sans effort est une bénédiction.

0 votes

Au cas où un autre noob tomberait sur cette solution intelligente : Le script vérifie si le premier paramètre est vide. Si c'est le cas, le script s'exécute à nouveau, mais cette fois avec le répertoire courant comme premier argument ( %0 est le nom de chemin du lot script).

11voto

Tae-Sung Shin Points 4157

Étant un programmeur, j'ai réalisé ce projet Winform de 10 minutes. Il m'a été utile. Faire de cette application un menu contextuel pour l'explorateur de fichiers permettrait d'économiser plus 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;
    }
}

1 votes

C'est une surcharge pour quiconque veut travailler à partir de la ligne de commande. Mais j'aime bien pour les programmes C#.

0 votes

Page MSDN pour api : GetShortPathName

7voto

gulbrandr Points 724

Exécuter cmd.exe et faites ce qui suit :

> cd "long path name"
> command

Ensuite, command.com apparaîtra et n'affichera que les chemins courts.

source

19 votes

Windows 7 ne dispose pas de command.com, du moins pas dans la version x64.

2 votes

Ce qui précède fonctionne sur Win7 32bit - je viens de le faire. Mais vous avez raison, cela ne fonctionne pas sur 64bit (également testé).

2 votes

Ni sur Windows 8 64bit

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X