Dapatkan jalur DOS, bukan jalur Windows

99

Di jendela DOS, bagaimana saya bisa mendapatkan nama DOS lengkap / nama pendek dari direktori tempat saya berada?

Misalnya, jika saya berada di direktori C:\Program Files\Java\jdk1.6.0_22, saya ingin menampilkan nama pendeknya C:\PROGRA~1\Java\JDK16~1.0_2.

Saya tahu menjalankan dir /xakan memberi saya nama pendek dari file / direktori di direktori saat ini tetapi saya belum dapat menemukan cara untuk menampilkan jalur lengkap dari direktori saat ini dalam format nama pendek. Saya harus bekerja melalui jalur dari root, direktori demi direktori, berjalan dir /xdi masing-masing.

Saya yakin ada cara yang lebih mudah untuk melakukan ini?

CodeClimber
sumber
2
Ada apa dengan menanyakannya di sini? Ada ratusan pertanyaan yang ditandai dengan DOS atau MS-DOS.
CodeClimber
Mungkin itu pertanyaan pemrograman yang berhubungan dengan DOS atau MS_DOS?
Pascal Cuoq
1
Ada ribuan pertanyaan yang diberi tag email atau video, tetapi ini masih bukan tempat untuk ditanyakan misalnya bagaimana cara melampirkan video ke email ...
Guffa
1
Saya pikir itu pertanyaan yang benar-benar valid untuk ditanyakan dan saya tidak menghargai suara negatifnya.
CodeClimber
12
Saya senang ditanyakan di sini - jawaban di bawah membantu saya.
monojohnny

Jawaban:

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

Ada cara yang lebih sederhana?

Timbo
sumber
2
Ini sangat timpang, dan membantu.
elgabito
Oke tapi bagaimana cara memasukkan nama direktori?
Marcos
3
Menemukan jawaban saya: for /d %I in (*) do @echo %~sI Setiap segmen jalur pendek, bagus. Masalahnya tidak langsung dengan nama yang panjang, atau bahkan spasi meskipun menyakitkan, tetapi yang terburuk adalah ketika karakter internasional hadir yang hanya selang skrip saya mengambil daftar dir ini sebagai masukan.
Marcos
luar biasa! Sangat membantu.
kulNinja
6
Jika Anda memanggil ini dari skrip batch Anda harus menghindari %tanda - tanda:for %%I in ("C:\folder with spaces") do echo %%~sI
Igor Popov
41

Anda juga dapat memasukkan berikut ini ke dalam jendela CMD:

dir <ParentDirectory> /X

Di mana <ParentDirectory>diganti dengan jalur lengkap dari direktori yang berisi item yang Anda ingin namanya.

Meskipun keluarannya tidak sesederhana jawaban Timbo , ia akan mencantumkan semua item dalam direktori yang ditentukan dengan nama sebenarnya dan (jika berbeda) nama pendeknya.

Jika Anda menggunakan, for %I in (.) do echo %~sIAnda dapat mengganti .dengan path lengkap dari file / folder untuk mendapatkan nama pendek dari file / folder tersebut (jika tidak, nama pendek dari folder saat ini akan dikembalikan).

Diuji pada Windows 7 x64.

Dicoret
sumber
29

Dalam skrip batch windows, %~s1memperluas parameter jalur ke nama pendek . Buat file batch ini:

@ECHO OFF
echo %~s1

Saya menelepon milik saya shortNamePath.cmddan menyebutnya seperti ini:

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

Edit: berikut adalah versi yang menggunakan direktori saat ini jika tidak ada parameter yang diberikan:

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

Disebut tanpa parameter:

C:\Program Files (x86)\Android\android-sdk>shortNamePath
C:\PROGRA~2\Android\ANDROI~1
gilly3
sumber
1
Cara yang cermat untuk menghasilkan utilitas untuk penggunaan di masa mendatang. Saya tidak bisa cukup berterima kasih atas solusi ini. Memanggil perintah seperti itu kapan saja dengan mudah adalah sebuah berkah.
Izzy Helianthus
Jika noob lain menemukan solusi pintar ini: Skrip memeriksa apakah parameter pertama kosong. Jika demikian, skrip berjalan sendiri lagi, tetapi kali ini dengan direktori saat ini sebagai argumen pertama (%0 adalah nama jalur skrip batch).
Sinjai
11

Menjadi seorang programmer membuat proyek Winform 10 menit ini. Itu berguna bagi saya. Membuat aplikasi ini menjadi menu konteks untuk file explorer akan menghemat lebih banyak klik.

Aplikasi 10 menit

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
sumber
1
Ini berlebihan bagi siapa pun yang ingin bekerja dari baris perintah. Tapi saya suka untuk program C #.
Eniola
Halaman MSDN untuk api: GetShortPathName
Amro
7

jalankan cmd.exedan lakukan hal berikut:

> cd "long path name"
> command

Kemudian command.com akan muncul dan hanya menampilkan jalur pendek.

sumber

gulbrandr.dll
sumber
18
Windows 7 tidak memiliki command.com, setidaknya tidak dalam versi x64.
Timbo
2
Di atas bekerja pada Win7 32bit - Saya baru saja melakukannya. Tapi Anda benar, itu tidak berfungsi pada 64bit (juga diuji).
cssyphus
2
tidak di windows 8 64bit
Dasun
5

Jawaban Kimbo sangat cocok untuk file normal.

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

Untuk nama file MsDos di HardLinks

Tautan keras yang dibuat dengan mklink /H <link> <target>tidak akan memiliki nama file pendek MsDos.

Jika Anda dir /Xdan Anda menemukan bahwa nama pendek yang hilang, Anda harus mengharapkan hal-hal berikut:

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

File normal

Pada kasus ini

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

Saya mendapatkan apa yang saya harapkan

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

File tautan keras

Pada kasus ini

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

Saya memiliki jalur MsDos normal tetapi nama file normal.

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

mirip dengan jawaban ini tetapi menggunakan sub-rutin

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

Jawaban seseorang yang lebih langsung adalah memperbaiki bug.

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

Jika tidak, RUNNER berakhir dengan tanda kutip, dan perintah "%RUNNER%" -Xmx128m ... berakhir dengan tanda kutip ganda. Hasilnya adalah Program dan File diperlakukan sebagai parameter terpisah.

Steven Davis
sumber
0

jika melalui penggunaan file batch:

set SHORT_DIR=%~dsp0%

Anda dapat menggunakan perintah echo untuk memeriksa:

echo %SHORT_DIR%
George
sumber