Holen Sie sich den DOS-Pfad anstelle des Windows-Pfads

99

Wie kann ich in einem DOS-Fenster den vollständigen DOS-Namen / Kurznamen des Verzeichnisses abrufen, in dem ich mich befinde?

Wenn ich mich beispielsweise im Verzeichnis C:\Program Files\Java\jdk1.6.0_22befinde, möchte ich dessen Kurznamen anzeigen C:\PROGRA~1\Java\JDK16~1.0_2.

Ich weiß, dass beim Ausführen dir /xdie Kurznamen der Dateien / Verzeichnisse im aktuellen Verzeichnis angezeigt werden, aber ich konnte keine Möglichkeit finden, den vollständigen Pfad des aktuellen Verzeichnisses im Kurznamenformat anzuzeigen. Ich muss mich durch den Pfad vom Stammverzeichnis arbeiten, Verzeichnis für Verzeichnis, das dir /xin jedem ausgeführt wird.

Ich bin sicher, es gibt einen einfacheren Weg, dies zu tun?

CodeClimber
quelle
2
Was ist falsch daran, es hier zu fragen? Es gibt Hunderte von Fragen, die mit DOS oder MS-DOS gekennzeichnet sind.
CodeClimber
Vielleicht sind es Programmierfragen zu DOS oder MS_DOS?
Pascal Cuoq
1
Es gibt Tausende von Fragen, die mit E-Mails oder Videos gekennzeichnet sind, aber dies ist immer noch nicht der richtige Ort, um beispielsweise zu fragen, wie ein Video an eine E-Mail
angehängt werden kann
1
Ich denke, es ist eine absolut gültige Frage, und ich schätze die Abwertung nicht.
CodeClimber
12
Ich bin froh, dass es hier gefragt wurde - die Antwort unten hat mir geholfen.
Monojohnny

Antworten:

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

Einfacher?

Timbo
quelle
2
Das ist sehr lahm und hilfreich.
Elgabito
Okay, aber wie soll es Verzeichnisnamen enthalten?
Marcos
3
Ich habe meine Antwort gefunden: for /d %I in (*) do @echo %~sI Jedes Pfadsegment ist kurz, großartig. Das Problem war nicht direkt mit den langen Namen oder Leerzeichen verbunden, obwohl es schmerzhaft ist, aber das Schlimmste ist, wenn internationale Zeichen vorhanden sind, die mein Skript einfach unter Verwendung dieser Verzeichnisliste als Eingabe abspritzen.
Marcos
genial! Sehr hilfreich.
KulNinja
6
Wenn Sie dies aus einem Batch-Skript aufrufen, müssen Sie den %Zeichen entkommen :for %%I in ("C:\folder with spaces") do echo %%~sI
Igor Popov
41

Sie können auch Folgendes in ein CMD-Fenster eingeben:

dir <ParentDirectory> /X

Wo <ParentDirectory> durch den vollständigen Pfad des Verzeichnisses ersetzt wird, das das Element enthält, für das Sie den Namen wünschen.

Die Ausgabe ist zwar nicht so einfach wie die Antwort von Timbo , listet jedoch alle Elemente im angegebenen Verzeichnis mit dem tatsächlichen Namen und (falls abweichend) dem Kurznamen auf.

Wenn Sie verwenden for %I in (.) do echo %~sI, können Sie den .durch den vollständigen Pfad der Datei / des Ordners ersetzen , um den Kurznamen dieser Datei / dieses Ordners zu erhalten (andernfalls wird der Kurzname des aktuellen Ordners zurückgegeben).

Getestet unter Windows 7 x64.

Trisped
quelle
29

Erweitert in Windows-Batch-Skripten %~s1die Pfadparameter zu Kurznamen . Erstellen Sie diese Batch-Datei:

@ECHO OFF
echo %~s1

Ich habe meine angerufen shortNamePath.cmdund es so genannt:

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

Bearbeiten: Hier ist eine Version, die das aktuelle Verzeichnis verwendet, wenn kein Parameter angegeben wurde:

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

Ohne Parameter aufgerufen:

C:\Program Files (x86)\Android\android-sdk>shortNamePath
C:\PROGRA~2\Android\ANDROI~1
gilly3
quelle
1
Eine sorgfältige Methode, um ein Dienstprogramm für die zukünftige Verwendung zu erstellen. Ich konnte Ihnen nicht genug für diese Lösung danken. Es ist ein Segen, jederzeit mühelos einen solchen Befehl zu rufen.
Izzy Helianthus
Für den Fall, dass ein anderer Noob auf diese clevere Lösung stößt: Das Skript prüft, ob der erste Parameter leer ist. In diesem Fall wird das Skript erneut ausgeführt, diesmal jedoch mit dem aktuellen Verzeichnis als erstem Argument ( %0ist der Pfadname des Batch-Skripts).
Sinjai
11

Als Programmierer hat er dieses 10-minütige Winform-Projekt gemacht. Es war nützlich für mich. Wenn Sie diese App zu einem Kontextmenü für den Datei-Explorer machen, sparen Sie mehr Klicks.

10 Minuten Anwendung

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
quelle
1
Dies ist ein Overkill für jeden, der über die Befehlszeile arbeiten möchte. Aber ich mag für C # -Programme.
Eniola
MSDN Seite für API: GetShortPathName
Amro
7

Führen cmd.exeSie Folgendes aus:

> cd "long path name"
> command

Dann wird command.com angezeigt und zeigt nur kurze Pfade an.

Quelle

gulbrandr
quelle
18
Windows 7 verfügt nicht über command.com, zumindest nicht in der x64-Version.
Timbo
2
Das obige funktioniert auf Win7 32bit - ich habe es gerade gemacht. Aber Sie haben Recht, es funktioniert nicht auf 64-Bit (auch getestet).
Cssyphus
2
weder unter Windows 8 64bit
Dasun
5

Kimbos Antwort ist perfekt für normale Dateien.

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

Für MsDos-Dateinamen auf HardLinks

Die mit erstellten Hardlinks mklink /H <link> <target> Hardlinks haben keinen kurzen MsDos-Dateinamen.

Falls Sie dir /Xund Sie feststellen, dass der Kurzname fehlt, sollten Sie Folgendes erwarten:

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

Normale Datei

In diesem Fall

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

Ich habe was ich erwartet habe

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

Hardlink-Datei

In diesem Fall

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

Ich habe den normalen MsDos-Pfad, aber den normalen Dateinamen.

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

ähnlich dieser Antwort , verwendet jedoch eine Unterroutine

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

Eine direktere Antwort ist, den Fehler zu beheben.

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

Andernfalls erhält der RUNNER Anführungszeichen und der Befehl "%RUNNER%" -Xmx128m ... doppelte Anführungszeichen. Das Ergebnis ist, dass Programm und Datei als separate Parameter behandelt werden.

Steven Davis
quelle
0

wenn über eine Batch-Datei verwenden:

set SHORT_DIR=%~dsp0%

Mit dem Befehl echo können Sie Folgendes überprüfen:

echo %SHORT_DIR%
George
quelle