รับเส้นทาง DOS แทนเส้นทาง Windows


100

ในหน้าต่าง DOS ฉันจะรับชื่อ DOS แบบเต็ม / ชื่อย่อของไดเร็กทอรีที่ฉันอยู่ได้อย่างไร

ตัวอย่างเช่นถ้าผมอยู่ในไดเรกทอรีผมต้องการที่จะแสดงชื่อสั้นC:\Program Files\Java\jdk1.6.0_22 ๆ ของมันC:\PROGRA~1\Java\JDK16~1.0_2

ฉันรู้ว่าการรันdir /xจะทำให้ฉันมีชื่อสั้น ๆ ของไฟล์ / ไดเร็กทอรีในไดเร็กทอรีปัจจุบัน แต่ฉันไม่สามารถหาวิธีแสดงพา ธ แบบเต็มของไดเร็กทอรีปัจจุบันในรูปแบบชื่อย่อได้ ฉันต้องทำงานตามเส้นทางจากรูทไดเร็กทอรีโดยไดเร็กทอรีกำลังทำงานdir /xในแต่ละ

ฉันแน่ใจว่ามีวิธีที่ง่ายกว่านี้?


2
ถามตรงนี้ผิดอะไร มีคำถามหลายร้อยข้อที่ติดแท็ก DOS หรือ MS-DOS
CodeClimber

บางทีอาจเป็นคำถามเกี่ยวกับการเขียนโปรแกรมที่เกี่ยวข้องกับ DOS หรือ MS_DOS?
Pascal Cuoq

1
มีคำถามหลายพันรายการที่ติดแท็กอีเมลหรือวิดีโอ แต่นี่ยังไม่ใช่สถานที่ที่จะถามเกี่ยวกับวิธีการแนบวิดีโอในอีเมล ...
Guffa

1
ฉันคิดว่ามันเป็นคำถามที่ถูกต้องอย่างสมบูรณ์ที่จะถามและฉันไม่ชอบการโหวตลง
CodeClimber

12
ฉันดีใจที่มีคนถามที่นี่ - คำตอบด้านล่างช่วยฉันได้
monojohnny

คำตอบ:


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

วิธีใดที่ง่ายกว่านี้


3
นี่เป็นเรื่องง่อยมากและเป็นประโยชน์
elgabito

โอเค แต่จะรวมชื่อไดเร็กทอรีได้อย่างไร?
Marcos

3
พบคำตอบของฉัน: for /d %I in (*) do @echo %~sI ทุกส่วนของเส้นทางนั้นสั้นและยอดเยี่ยม ปัญหาไม่ได้อยู่ที่ชื่อยาวโดยตรงหรือแม้กระทั่งช่องว่างแม้ว่าจะเจ็บปวด แต่ที่แย่ที่สุดคือเมื่อมีตัวละครสากลซึ่งทำให้สคริปต์ของฉันใช้รายการ dir นี้เป็นอินพุต
Marcos

สุดยอด! เป็นประโยชน์อย่างยิ่ง
kulNinja

6
หากคุณเรียกสิ่งนี้จากสคริปต์แบทช์คุณต้องหลีกเลี่ยง%สัญญาณ:for %%I in ("C:\folder with spaces") do echo %%~sI
Igor Popov

41

คุณยังสามารถป้อนสิ่งต่อไปนี้ในหน้าต่าง CMD:

dir <ParentDirectory> /X

ที่ไหน <ParentDirectory>จะถูกแทนที่ด้วยเส้นทางแบบเต็มของไดเรกทอรีที่มีรายการที่คุณต้องการชื่อ

แม้ว่าผลลัพธ์จะไม่ง่ายเหมือนคำตอบของ Timboแต่ก็จะแสดงรายการทั้งหมดในไดเร็กทอรีที่ระบุด้วยชื่อจริงและ (ถ้าแตกต่างกัน) ชื่อย่อ

หากคุณใช้for %I in (.) do echo %~sIคุณสามารถแทนที่.ด้วยพา ธ แบบเต็มของไฟล์ / โฟลเดอร์เพื่อรับชื่อย่อของไฟล์ / โฟลเดอร์นั้น (มิฉะนั้นชื่อย่อของโฟลเดอร์ปัจจุบันจะถูกส่งกลับ)

ทดสอบบน Windows 7 x64


29

ในสคริปต์หน้าต่างชุดขยายพารามิเตอร์เส้นทางไปยังชื่อที่สั้น%~s1 สร้างไฟล์แบตช์นี้:

@ECHO OFF
echo %~s1

ฉันเรียกของฉันshortNamePath.cmdและเรียกมันแบบนี้:

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

แก้ไข:นี่คือเวอร์ชันที่ใช้ไดเร็กทอรีปัจจุบันหากไม่มีการระบุพารามิเตอร์:

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

เรียกว่าไม่มีพารามิเตอร์:

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

1
วิธีที่พิถีพิถันในการผลิตยูทิลิตี้สำหรับการใช้งานในอนาคต ฉันไม่สามารถขอบคุณคุณมากพอสำหรับการแก้ปัญหานี้ การเรียกใช้คำสั่งดังกล่าวได้ตลอดเวลาถือเป็นพร
Izzy Helianthus

ในกรณีที่ noob อื่นเจอโซลูชันที่ชาญฉลาดนี้สคริปต์จะตรวจสอบว่าพารามิเตอร์แรกว่างหรือไม่ หากเป็นเช่นนั้นสคริปต์จะรันตัวเองอีกครั้ง แต่คราวนี้มีไดเร็กทอรีปัจจุบันเป็นอาร์กิวเมนต์แรก ( %0คือชื่อพา ธ ของสคริปต์ชุดงาน)
สินจัย

11

การเป็นโปรแกรมเมอร์ทำให้โครงการ Winform 10 นาทีนี้ มันมีประโยชน์สำหรับฉัน การทำให้แอปนี้เป็นเมนูบริบทสำหรับ file explorer จะช่วยประหยัดการคลิกได้มากขึ้น

แอปพลิเคชั่น 10 นาที

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
นี่เป็นเรื่องที่ทุกคนต้องการทำงานจากบรรทัดคำสั่งมากเกินไป แต่ฉันชอบโปรแกรม C #
Eniola

หน้า MSDN สำหรับ api: GetShortPathName
Amro

7

เรียกใช้cmd.exeและทำสิ่งต่อไปนี้:

> cd "long path name"
> command

จากนั้น command.com จะขึ้นมาและแสดงเฉพาะเส้นทางสั้น ๆ

แหล่งที่มา


18
Windows 7 ไม่มี command.com อย่างน้อยก็ไม่มีในเวอร์ชัน x64
Timbo

2
ข้างต้นใช้งานได้กับ Win7 32bit - ฉันเพิ่งทำไป แต่คุณพูดถูกมันใช้ไม่ได้กับ 64 บิต (ทดสอบด้วย)
cssyphus

2
ทั้งบน windows 8 64bit
Dasun

5

คำตอบของ Kimbo เหมาะสำหรับไฟล์ปกติ

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

สำหรับชื่อไฟล์ MsDos บน HardLinks

ฮาร์ดลิงก์ที่สร้างด้วยmklink /H <link> <target>จะไม่มีชื่อไฟล์แบบสั้นของ MsDos

ในกรณีที่คุณdir /Xและคุณพบว่าไม่มีชื่อย่อคุณควรคาดหวังสิ่งต่อไปนี้:

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

ไฟล์ปกติ

ในกรณีนี้

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

ฉันมีสิ่งที่ฉันคาดหวัง

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

ไฟล์ฮาร์ดลิงก์

ในกรณีนี้

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

ฉันมีเส้นทาง MsDos ปกติ แต่ชื่อไฟล์ปกติ

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

1

คล้ายกับคำตอบนี้แต่ใช้รูทีนย่อย

@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

1

คำตอบที่ตรงไปกว่านั้นคือการแก้ไขข้อบกพร่อง

% SPARK_HOME% \ bin \ spark-class2.cmd; บรรทัด 54
Broken: set RUNNER="%JAVA_HOME%\bin\java"
Windows Style: set "RUNNER=%JAVA_HOME%\bin\java"

มิฉะนั้น RUNNER จะลงท้ายด้วยเครื่องหมายคำพูดและคำสั่ง "%RUNNER%" -Xmx128m ... จะลงท้ายด้วยเครื่องหมายคำพูดคู่ ผลลัพธ์คือโปรแกรมและไฟล์จะถือว่าเป็นพารามิเตอร์แยกกัน



1

หากผ่านไฟล์แบตช์ให้ใช้:

set SHORT_DIR=%~dsp0%

คุณสามารถใช้คำสั่ง echo เพื่อตรวจสอบ:

echo %SHORT_DIR%

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.