Nhận đường dẫn DOS thay vì đường dẫn Windows


99

Trong cửa sổ DOS, làm cách nào để lấy tên DOS đầy đủ / tên viết tắt của thư mục mà tôi đang ở?

Ví dụ, nếu tôi đang ở trong thư mục C:\Program Files\Java\jdk1.6.0_22, tôi muốn hiển thị tên ngắn của nó C:\PROGRA~1\Java\JDK16~1.0_2.

Tôi biết việc chạy dir /xsẽ cung cấp cho tôi tên ngắn của tệp / thư mục trong thư mục hiện tại nhưng tôi không thể tìm cách hiển thị đường dẫn đầy đủ của thư mục hiện tại ở định dạng tên ngắn. Tôi đang phải làm việc theo cách của mình thông qua đường dẫn từ thư mục gốc, từng thư mục, chạy dir /xtrong từng thư mục.

Tôi chắc rằng có một cách dễ dàng hơn để làm điều này?


2
Có gì sai khi hỏi nó ở đây? Có hàng trăm câu hỏi được gắn thẻ DOS hoặc MS-DOS.
CodeClimber

Có lẽ họ là câu hỏi lập trình liên quan đến DOS hoặc MS_DOS?
Pascal Cuoq,

1
Hiện có hàng ngàn câu hỏi được gắn thẻ email hoặc video, nhưng đây vẫn là không phải là nơi để hỏi về ví dụ làm thế nào để đính kèm một đoạn video để email ...
Guffa

1
Tôi nghĩ rằng đó là một câu hỏi hoàn toàn hợp lệ để hỏi và tôi không đánh giá cao việc bỏ phiếu xuống.
CodeClimber

12
Tôi rất vui vì nó đã được hỏi ở đây - câu trả lời bên dưới đã giúp tôi.
monojohnny

Câu trả lời:


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

Có cách nào đơn giản hơn không?


2
Điều này là rất khập khiễng và hữu ích.
elgabito

Được rồi nhưng làm thế nào để nó bao gồm tên thư mục?
Marcos

3
Đã tìm thấy câu trả lời của tôi: for /d %I in (*) do @echo %~sI Mọi đoạn đường dẫn đều ngắn, tuyệt vời. Rắc rối không trực tiếp với những cái tên dài, thậm chí là khoảng trắng cũng không khó, nhưng tệ nhất là khi các ký tự quốc tế có mặt, điều này chỉ đơn giản là tập lệnh của tôi lấy danh sách dir này làm đầu vào.
Marcos

tuyệt vời! Rất hữu ích.
kulNinja

6
Nếu bạn đang gọi điều này từ một tập lệnh hàng loạt, bạn phải thoát khỏi các %dấu hiệu:for %%I in ("C:\folder with spaces") do echo %%~sI
Igor Popov

41

Bạn cũng có thể nhập thông tin sau vào cửa sổ CMD:

dir <ParentDirectory> /X

Nơi <ParentDirectory>được thay thế bằng đường dẫn đầy đủ của thư mục chứa mục bạn muốn đặt tên.

Mặc dù đầu ra không đơn giản như câu trả lời của Timbo , nhưng nó sẽ liệt kê tất cả các mục trong thư mục được chỉ định với tên thực và (nếu khác) tên viết tắt.

Nếu bạn sử dụng, for %I in (.) do echo %~sIbạn có thể thay thế .bằng đường dẫn đầy đủ của tệp / thư mục để lấy tên viết tắt của tệp / thư mục đó (nếu không sẽ trả về tên viết tắt của thư mục hiện tại).

Đã thử nghiệm trên Windows 7 x64.


29

Trong tập lệnh hàng loạt của windows, %~s1mở rộng các tham số đường dẫn thành tên ngắn . Tạo tệp hàng loạt này:

@ECHO OFF
echo %~s1

Tôi đã gọi cho tôi shortNamePath.cmdvà gọi nó như thế này:

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

Chỉnh sửa: đây là phiên bản sử dụng thư mục hiện tại nếu không có tham số nào được cung cấp:

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

Được gọi không có tham số:

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

1
Một cách tỉ mỉ để tạo ra một tiện ích để sử dụng trong tương lai. Tôi không thể cảm ơn bạn đủ cho giải pháp này. Gọi lệnh như vậy bất cứ lúc nào dễ dàng là một may mắn.
Izzy Helianthus

Trong trường hợp một noob khác gặp phải giải pháp thông minh này: Tập lệnh kiểm tra xem tham số đầu tiên có trống không. Nếu vậy, tập lệnh sẽ tự chạy lại, nhưng lần này với thư mục hiện tại làm đối số đầu tiên ( %0là tên đường dẫn của tập lệnh lô).
Sinjai

11

Là một lập trình viên đã thực hiện dự án Winform 10 phút này. Nó rất hữu ích cho tôi. Đặt ứng dụng này thành menu ngữ cảnh cho trình khám phá tệp sẽ tiết kiệm nhiều lần nhấp hơn.

Ứng dụng 10 phút

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
Điều này là quá mức cần thiết của bất kỳ ai muốn làm việc từ dòng lệnh. Nhưng tôi thích các chương trình C #.
Eniola

MSDN trang cho api: GetShortPathName
Amro

7

chạy cmd.exevà làm như sau:

> cd "long path name"
> command

Khi đó command.com sẽ xuất hiện và chỉ hiển thị các đường dẫn ngắn.

nguồn


18
Windows 7 không có command.com, ít nhất là không có trong phiên bản x64.
Timbo 29/10/10

2
Cách trên hoạt động trên Win7 32bit - Tôi vừa làm. Nhưng bạn nói đúng, nó không hoạt động trên 64bit (cũng đã được thử nghiệm).
cssyphus

2
không trên windows 8 64bit
Dasun

5

Câu trả lời của Kimbo là hoàn hảo cho các tệp thông thường.

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

Đối với tên tệp MsDos trên HardLinks

Các liên kết cứng được tạo mklink /H <link> <target>sẽ không có tên tệp ngắn MsDos.

Trong trường hợp bạn dir /Xvà bạn phát hiện ra rằng tên viết tắt bị thiếu, bạn nên mong đợi những điều sau:

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

Tệp bình thường

Trong trường hợp này

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

Tôi đã có những gì tôi mong đợi

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

Tệp liên kết cứng

Trong trường hợp này

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

Tôi có đường dẫn MsDos bình thường nhưng tên tệp bình thường.

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

1

tương tự như câu trả lời này nhưng sử dụng một quy trình phụ

@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

Một ai đó trả lời trực tiếp hơn là sửa lỗi.

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

Nếu không, RUNNER kết thúc bằng dấu ngoặc kép và lệnh "%RUNNER%" -Xmx128m ... kết thúc bằng dấu ngoặc kép. Kết quả là Chương trình và Tệp được coi là các tham số riêng biệt.



0

nếu thông qua một tệp hàng loạt, hãy sử dụng:

set SHORT_DIR=%~dsp0%

bạn có thể sử dụng lệnh echo để kiểm tra:

echo %SHORT_DIR%

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.