Obtenez le chemin DOS au lieu du chemin Windows

99

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 /xme donnera les noms courts des fichiers / répertoires dans le répertoire courant, mais je n'ai pas été en mesure de trouver un moyen d'afficher le chemin complet du répertoire courant au format de nom court. Je dois parcourir le chemin depuis la racine, répertoire par répertoire, en cours d'exécution dir /xdans chacun.

Je suis sûr qu'il existe un moyen plus simple de le faire?

CodeClimber
la source
2
Quel est le problème à le demander ici? Il y a des centaines de questions étiquetées avec DOS ou MS-DOS.
CodeClimber
Peut-être s'agit-il de questions de programmation liées à DOS ou MS_DOS?
Pascal Cuoq
1
Il y a des milliers de questions taguées par e-mail ou vidéo, mais ce n'est toujours pas le lieu de se poser sur par exemple comment joindre une vidéo à un e-mail ...
Guffa
1
Je pense que c'est une question parfaitement valable à poser et je n'apprécie pas le vote défavorable.
CodeClimber
12
Je suis heureux que cela ait été posé ici - la réponse ci-dessous m'a aidé.
monojohnny

Réponses:

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

Un moyen plus simple?

Timbo
la source
2
C'est très boiteux et utile.
elgabito
D'accord mais comment faire inclure les noms de répertoires?
Marcos
3
J'ai trouvé ma réponse: for /d %I in (*) do @echo %~sI chaque segment de chemin est court, excellent. Le problème n'était pas directement avec les noms longs, ni même avec les espaces, mais le pire, c'est quand des caractères internationaux sont présents, ce qui fait simplement passer mon script en prenant cette liste de répertoires comme entrée.
Marcos
impressionnant! Très utile.
kulNinja
6
Si vous appelez cela à partir d'un script batch, vous devez échapper aux %signes:for %%I in ("C:\folder with spaces") do echo %%~sI
Igor Popov
41

Vous pouvez également saisir ce qui suit 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 le nom.

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

Si vous utilisez, for %I in (.) do echo %~sIvous 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 renvoyé).

Testé sur Windows 7 x64.

Trisped
la source
29

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

@ECHO OFF
echo %~s1

J'ai appelé le mien shortNamePath.cmdet l'appelle 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
gilly3
la source
1
Une manière méticuleuse de produire un utilitaire pour une utilisation future. Je ne saurais trop vous remercier pour cette solution. Appeler une telle commande à tout moment sans effort est une bénédiction.
Izzy Helianthus
Au cas où un autre noob trouverait cette solution intelligente: le script vérifie si le premier paramètre est vide. Si tel est le cas, le script s'exécute à nouveau, mais cette fois avec le répertoire courant comme premier argument ( %0c'est le chemin du script batch).
Sinjai
11

Être 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 permettrait d'économiser plus de clics.

Application de 10 minutes

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
la source
1
C'est exagéré de la part de quiconque souhaite travailler à partir de la ligne de commande. Mais j'aime bien les programmes C #.
Eniola du
Page MSDN pour api: GetShortPathName
Amro
7

exécutez cmd.exeet procédez comme suit:

> cd "long path name"
> command

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

la source

Gulbrandr
la source
18
Windows 7 n'a pas command.com, du moins pas dans la version x64.
Timbo
2
Ce qui précède fonctionne sur Win7 32 bits - je viens de le faire. Mais vous avez raison, cela ne fonctionne pas sur 64 bits (également testé).
cssyphus
2
ni sur windows 8 64bit
Dasun
5

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

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

Pour les noms de fichiers MsDos sur HardLinks

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

Dans le cas où vous dir /Xet vous découvrez ce nom court manquant, vous devriez vous attendre à ce qui suit:

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 physique

Dans ce cas

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

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

d:\personal\PH124E~1\2013-P~3\2013-12-22--12-10-52------Bulevardul-Petrochimiștilor.jpg`
raisins secs
la source
1

similaire à cette 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
ClearBlueSky85
la source
1

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. Le résultat est que le programme et le fichier sont traités comme des paramètres séparés.

Steven Davis
la source
1

si via un fichier batch, utilisez:

set SHORT_DIR=%~dsp0%

vous pouvez utiliser la commande echo pour vérifier:

echo %SHORT_DIR%
George
la source