Windows yolu yerine DOS yolunu alın


99

Bir DOS penceresinde, bulunduğum dizinin tam DOS adını / kısa adını nasıl alabilirim?

Örneğin dizinin içindeysem C:\Program Files\Java\jdk1.6.0_22, kısa adını görüntülemek istiyorum C:\PROGRA~1\Java\JDK16~1.0_2.

dir /xÇalıştırmanın bana geçerli dizindeki dosyaların / dizinlerin kısa adlarını vereceğini biliyorum , ancak geçerli dizinin tam yolunu kısa ad biçiminde görüntülemenin bir yolunu bulamadım. Kökten, dizinden dizine, dir /xher birinde çalışarak kendi yolumda çalışmak zorundayım .

Eminim bunu yapmanın daha kolay bir yolu vardır?


2
Burada sormanın nesi yanlış? DOS veya MS-DOS ile etiketlenmiş yüzlerce soru vardır.
CodeClimber

Belki de DOS veya MS_DOS ile ilgili soruları programlıyorlar?
Pascal Cuoq

1
E-posta veya video olarak etiketlenmiş binlerce soru var, ancak burası hala örneğin bir e-postaya bir videonun nasıl ekleneceği hakkında sorulacak yer değil ...
Guffa

1
Bence sorulması tamamen geçerli bir soru ve olumsuz oyu beğenmiyorum.
CodeClimber

12
Burada sorulduğuna sevindim - aşağıdaki cevap bana yardımcı oldu.
monojohnny

Yanıtlar:


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

Daha basit bir yol var mı?


2
Bu çok kötü ve yardımcı.
elgabito

Tamam ama dizin adlarını nasıl içerecek?
Marcos

3
Cevabımı buldum: for /d %I in (*) do @echo %~sI Her yol segmenti kısa, harika. Sorun, doğrudan uzun adlarla veya boşluklarla ilgili değildi, acı olsa da, ancak en kötüsü, bu dizin listesini girdi olarak alan betiğimi hortumlayan uluslararası karakterlerin mevcut olmasıdır.
Marcos

harika! Çok yardımcı oldu.
kulNinja

6
Bunu bir toplu komut dosyasından çağırıyorsanız, %işaretlerden for %%I in ("C:\folder with spaces") do echo %%~sI
Igor Popov

41

Aşağıdakileri bir CMD penceresine de girebilirsiniz:

dir <ParentDirectory> /X

Nerede <ParentDirectory>öğeyi içeren dizinin tam yolu ile değiştirilir için adını istiyorum.

Çıktı, Timbo'nun cevabı kadar basit olmasa da , belirtilen dizindeki tüm öğeleri gerçek adla ve (farklıysa) kısa adla listeleyecektir.

Eğer kullanırsanız , o dosyanın / klasörün kısa adını almak için dosya / klasörün tam yolunu for %I in (.) do echo %~sIdeğiştirebilirsiniz .(aksi takdirde mevcut klasörün kısa adı döndürülür).

Windows 7 x64 üzerinde test edilmiştir.


29

Windows toplu komut dosyalarında, %~s1yol parametrelerini kısa adlara genişletir . Bu toplu iş dosyasını oluşturun:

@ECHO OFF
echo %~s1

Benimkini aradım shortNamePath.cmdve şöyle çağırdım :

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

Düzenleme: Burada, parametre sağlanmadıysa geçerli dizini kullanan bir sürüm verilmiştir:

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

Parametre olmadan çağrılır:

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

1
İleride kullanmak üzere bir yardımcı program üretmenin titiz bir yolu. Bu çözüm için ne kadar teşekkür etsem azdır. Böyle bir komutu her zaman zahmetsizce çağırmak bir nimettir.
Izzy Helianthus

Başka bir noob'un bu akıllı çözümle karşılaşması durumunda: Komut, ilk parametrenin boş olup olmadığını kontrol eder. Eğer öyleyse, komut dosyası yeniden çalışır, ancak bu sefer ilk bağımsız değişken olarak geçerli dizin ( %0toplu iş dosyasının yol adıdır).
Sinjai

11

Bu 10 dakikalık Winform projesini programcı olarak yaptı. Benim için faydalı oldu. Bu uygulamayı dosya gezgini için bir bağlam menüsüne dönüştürmek daha fazla tıklama tasarrufu sağlayacaktır.

10 dakikalık uygulama

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
Bu, komut satırından çalışmak isteyenler için gereğinden fazla. Ama C # programlarını seviyorum.
Eniola

Api için MSDN sayfası: GetShortPathName
Amro

7

çalıştırın cmd.exeve aşağıdakileri yapın:

> cd "long path name"
> command

Sonra command.com gelecek ve yalnızca kısa yolları gösterecektir.

kaynak


18
Windows 7'de command.com'a sahip değil, en azından x64 sürümünde.
Timbo

2
Yukarıdakiler Win7 32bit üzerinde çalışıyor - ben yaptım. Ama haklısın, 64bit'te çalışmıyor (ayrıca test edildi).
cssyphus

2
ne windows 8 64bit
Dasun

5

Kimbo'nun cevabı normal dosyalar için mükemmel.

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

HardLinks üzerindeki MsDos dosya adları için

mklink /H <link> <target>İle oluşturulan sabit bağlantıların MsDos kısa dosya adı olmayacaktır.

Siz dir /Xve siz bu eksik kısa adı keşfederseniz, aşağıdakileri beklemelisiniz:

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

Normal dosya

Bu durumda

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

Beklediğim şeyi aldım

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

Sabit bağlantı dosyası

Bu durumda

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

Normal MsDos yoluna sahibim ama normal dosya adı.

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

1

bu yanıta benzer ancak bir alt rutin kullanır

@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

Daha doğrudan bir cevap, hatayı düzeltmektir.

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

Aksi takdirde, RUNNER tırnak işaretleriyle "%RUNNER%" -Xmx128m ... biter ve komut çift ​​tırnakla biter. Sonuç, Program ve Dosyanın ayrı parametreler olarak değerlendirilmesidir.



1

bir toplu iş dosyası kullanarak:

set SHORT_DIR=%~dsp0%

echo komutunu kullanarak şunları kontrol edebilirsiniz:

echo %SHORT_DIR%

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.