Uzyskaj ścieżkę DOS zamiast ścieżki Windows

99

W oknie DOS, jak mogę uzyskać pełną nazwę DOS / skróconą nazwę katalogu, w którym się znajduję?

Na przykład, jeśli jestem w katalogu C:\Program Files\Java\jdk1.6.0_22, chcę wyświetlić jego krótką nazwę C:\PROGRA~1\Java\JDK16~1.0_2.

Wiem, że uruchomienie dir /xda mi krótkie nazwy plików / katalogów w bieżącym katalogu, ale nie byłem w stanie znaleźć sposobu, aby wyświetlić pełną ścieżkę bieżącego katalogu w formacie krótkiej nazwy. Muszę przedrzeć się przez ścieżkę od katalogu głównego, katalog po katalogu, działając dir /xw każdym z nich.

Jestem pewien, że istnieje łatwiejszy sposób na zrobienie tego?

CodeClimber
źródło
2
Co jest złego w zadawaniu tego tutaj? Istnieją setki pytań oznaczonych jako DOS lub MS-DOS.
CodeClimber
Być może są to pytania programistyczne związane z DOS lub MS_DOS?
Pascal Cuoq
1
Istnieją tysiące pytań oznaczonych jako e-mail lub wideo, ale nadal nie jest to miejsce, w którym można zapytać, na przykład, jak załączyć wideo do e-maila ...
Guffa
1
Myślę, że to bardzo ważne pytanie i nie podoba mi się głos negatywny.
CodeClimber
12
Cieszę się, że został tutaj zapytany - odpowiedź poniżej pomogła mi.
monojohnny

Odpowiedzi:

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

Jakiś prostszy sposób?

Timbo
źródło
2
To jest bardzo kiepskie i pomocne.
elgabito
Dobrze, ale jak to mieć, aby zawierały nazwy katalogów?
Marcos
3
Znalazłem odpowiedź: for /d %I in (*) do @echo %~sI każdy odcinek ścieżki jest krótki, świetny. Problem nie dotyczył bezpośrednio długich nazw ani nawet spacji, chociaż były uciążliwe, ale najgorsze jest, gdy obecne są znaki międzynarodowe, które po prostu łączą mój skrypt, biorąc tę ​​listę katalogów jako dane wejściowe.
Marcos
niesamowite! Bardzo pomocny.
kulNinja
6
Jeśli wywołujesz to ze skryptu wsadowego, musisz uciec przed %znakami:for %%I in ("C:\folder with spaces") do echo %%~sI
Igor Popov
41

Możesz także wprowadzić następujące informacje w oknie CMD:

dir <ParentDirectory> /X

Gdzie <ParentDirectory>jest zastępowane pełną ścieżką do katalogu zawierającego element, którego nazwę chcesz nadać.

Chociaż wynik nie jest tak prosty, jak odpowiedź Timbo , wyświetli listę wszystkich elementów w określonym katalogu z rzeczywistą nazwą i (jeśli jest inna) krótką nazwą.

Jeśli używasz for %I in (.) do echo %~sI, możesz zastąpić nazwę .pełną ścieżką do pliku / folderu, aby uzyskać krótką nazwę tego pliku / folderu (w przeciwnym razie zwracana jest krótka nazwa bieżącego folderu).

Przetestowano w systemie Windows 7 x64.

Trisped
źródło
29

W skryptach wsadowych systemu Windows %~s1rozszerza parametry ścieżki do krótkich nazw . Utwórz ten plik wsadowy:

@ECHO OFF
echo %~s1

Zadzwoniłem do mnie shortNamePath.cmdi tak to nazywam:

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

Edycja: oto wersja, która używa bieżącego katalogu, jeśli nie podano żadnego parametru:

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

Wywołane bez parametrów:

C:\Program Files (x86)\Android\android-sdk>shortNamePath
C:\PROGRA~2\Android\ANDROI~1
gilly3
źródło
1
Skrupulatny sposób tworzenia narzędzia do wykorzystania w przyszłości. Nie mogłem ci wystarczająco podziękować za to rozwiązanie. Wywołanie takiego polecenia w dowolnym momencie bez wysiłku jest błogosławieństwem.
Izzy Helianthus,
W przypadku, gdy inny noob natrafi na to sprytne rozwiązanie: skrypt sprawdza, czy pierwszy parametr jest pusty. Jeśli tak, skrypt uruchamia się ponownie, ale tym razem z bieżącym katalogiem jako pierwszym argumentem ( %0jest to ścieżka do skryptu wsadowego).
Sinjai
11

Będąc programistą wykonałem ten 10-minutowy projekt Winform. To mi się przydało. Przekształcenie tej aplikacji w menu kontekstowe eksploratora plików pozwoliłoby zaoszczędzić więcej kliknięć.

Aplikacja 10 minut

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
źródło
1
To przesada dla każdego, kto chce pracować z wiersza poleceń. Ale lubię programy C #.
Eniola,
Strona MSDN dla api: GetShortPathName
Amro
7

uruchom cmd.exei wykonaj następujące czynności:

> cd "long path name"
> command

Wtedy command.com pojawi się i wyświetli tylko krótkie ścieżki.

źródło

gulbrandr
źródło
18
Windows 7 nie ma command.com, przynajmniej nie w wersji x64.
Timbo
2
Powyższe działa na Win7 32bit - właśnie to zrobiłem. Ale masz rację, nie działa na 64-bitowym (również przetestowanym).
cssyphus
2
ani w systemie Windows 8 64bit
Dasun
5

Odpowiedź Kimbo jest idealna dla zwykłych plików.

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

Dla nazw plików MsDos na HardLinks

Twarde łącza utworzone za pomocą mklink /H <link> <target>nie będą miały krótkiej nazwy pliku MsDos.

Jeśli ty dir /Xi ty odkryjesz brakującą krótką nazwę, powinieneś spodziewać się następujących rzeczy:

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

Normalny plik

W tym przypadku

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

Mam to, czego się spodziewałem

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

Plik łącza twardego

W tym przypadku

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

Mam normalną ścieżkę MsDos, ale normalną nazwę pliku.

d:\personal\PH124E~1\2013-P~3\2013-12-22--12-10-52------Bulevardul-Petrochimiștilor.jpg`
raisercostin
źródło
1

podobny do tej odpowiedzi, ale używa podprogramu

@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
źródło
1

Bardziej bezpośrednią odpowiedzią jest naprawienie błędu.

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

W przeciwnym razie RUNNER kończy się cudzysłowami, a polecenie "%RUNNER%" -Xmx128m ... cudzysłowami. W rezultacie Program i Plik są traktowane jako oddzielne parametry.

Steven Davis
źródło
1

jeśli za pośrednictwem pliku wsadowego użyj:

set SHORT_DIR=%~dsp0%

możesz użyć polecenia echo, aby sprawdzić:

echo %SHORT_DIR%
Jerzy
źródło