विंडोज पथ के बजाय डॉस पथ प्राप्त करें


99

डॉस विंडो में, मैं जिस निर्देशिका में हूं उसका पूरा डॉस नाम / संक्षिप्त नाम कैसे प्राप्त कर सकता हूं?

उदाहरण के लिए, यदि मैं निर्देशिका में हूं, तो मैं C:\Program Files\Java\jdk1.6.0_22इसे संक्षिप्त नाम प्रदर्शित करना चाहता हूं C:\PROGRA~1\Java\JDK16~1.0_2

मुझे पता है कि दौड़ने dir /xसे मुझे वर्तमान निर्देशिका में फ़ाइलों / निर्देशिकाओं के संक्षिप्त नाम मिल जाएंगे, लेकिन मैं संक्षिप्त नाम प्रारूप में वर्तमान निर्देशिका के पूर्ण पथ को प्रदर्शित करने का एक तरीका नहीं खोज पाया हूँ। मुझे रूट से रूट के माध्यम से अपना काम करना है, डायरेक्टरी बाय डायरेक्टरी, dir /xप्रत्येक में चल रहा है।

मुझे यकीन है कि ऐसा करने का एक आसान तरीका है?


2
यहाँ यह पूछने में क्या हर्ज है? DOS या MS-DOS के साथ टैग किए गए सैकड़ों प्रश्न हैं।
कोडिकंबर

शायद वे DOS या MS_DOS से संबंधित प्रश्न पूछ रहे हैं?
पास्कल कूउक

1
ईमेल या वीडियो टैग किए गए हजारों प्रश्न हैं, लेकिन यह अभी भी उदाहरण के बारे में पूछने का स्थान नहीं है कि किसी वीडियो को ईमेल पर कैसे संलग्न किया जाए ...
गुफा

1
मुझे लगता है कि यह पूछना पूरी तरह से वैध सवाल है और मैं डाउन वोट की सराहना नहीं करता।
कोडिकंबर

12
मुझे खुशी है कि यह यहाँ पर पूछा गया था - नीचे दिए गए जवाब से मुझे मदद मिली।
मोनोजोनी

जवाबों:


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

कोई सरल तरीका?


2
यह बहुत ही लंगड़ा, और मददगार है।
एल्गाबिटो सेप

ठीक है, लेकिन इसमें निर्देशिका नाम कैसे शामिल हैं?
मार्कोस

3
मेरा जवाब मिला: for /d %I in (*) do @echo %~sI हर पथ खंड छोटा, महान है। कष्ट सीधे-सीधे लंबे नामों के साथ नहीं था, न ही रिक्त स्थान हालांकि एक दर्द था, लेकिन सबसे बुरा तब है जब अंतर्राष्ट्रीय वर्ण मौजूद हैं जो कि इस स्क्रिप्ट को इनपुट के रूप में लेते हुए मेरी स्क्रिप्ट को नली कर देते हैं।
मार्कोस

बहुत बढ़िया! बहुत मददगार।
kulNinja 21

6
यदि आप इसे एक बैच स्क्रिप्ट से बुला रहे हैं तो आपको %संकेतों से बचना होगा :for %%I in ("C:\folder with spaces") do echo %%~sI
इगोर पोपोव

41

आप सीएमडी विंडो में निम्नलिखित भी दर्ज कर सकते हैं:

dir <ParentDirectory> /X

कहाँ <ParentDirectory>आप के लिए नाम चाहते हैं निर्देशिका वस्तु वाले का पूरा पथ साथ बदल दिया है।

जबकि टिम्बो के जवाब के रूप में आउटपुट सरल नहीं है , यह वास्तविक नाम और (यदि अलग है) संक्षिप्त नाम के साथ निर्दिष्ट निर्देशिका में सभी वस्तुओं को सूचीबद्ध करेगा।

यदि आप उपयोग करते हैं for %I in (.) do echo %~sIतो आप इसे बदल सकते हैं. उस फ़ाइल / फ़ोल्डर का संक्षिप्त नाम प्राप्त करने के लिए फ़ाइल / फ़ोल्डर के पूर्ण पथ के साथ (अन्यथा वर्तमान फ़ोल्डर का संक्षिप्त नाम वापस आ जाता है)।

विंडोज 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
भविष्य के उपयोग के लिए एक उपयोगिता का उत्पादन करने का एक शानदार तरीका। मैं इस समाधान के लिए आपको पर्याप्त धन्यवाद नहीं दे सकता। ऐसे आदेश को सहजता से कभी भी बुलाना एक आशीर्वाद है।
इज़ी हेलियनथस

यदि कोई दूसरा नॉब इस चतुर समाधान में आता है: यदि पहला पैरामीटर खाली है तो स्क्रिप्ट जांचती है। यदि ऐसा है, तो स्क्रिप्ट फिर से चलती है, लेकिन इस बार वर्तमान निर्देशिका के साथ पहले तर्क के रूप में ( %0बैच स्क्रिप्ट का पथनाम है)।
सिंजई

11

एक प्रोग्रामर होने के नाते यह 10 मिनट का Winform प्रोजेक्ट बना। यह मेरे लिए उपयोगी रहा है। फ़ाइल एक्सप्लोरर के लिए एक संदर्भ मेनू में इस ऐप को बनाने से अधिक क्लिक बचेंगे।

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 # प्रोग्राम पसंद हैं।
एनिओला


7

दौड़ें cmd.exeऔर निम्न कार्य करें:

> cd "long path name"
> command

इसके बाद कमबैक सामने आएगा और केवल छोटे रास्ते दिखाए जाएंगे।

स्रोत


18
विंडोज 7 में कमपीस नहीं है, कम से कम x64 संस्करण में नहीं है।
टिम्बो

2
ऊपर Win7 32bit पर काम करता है - मैंने अभी किया। लेकिन आप सही कह रहे हैं, यह 64 बिट (परीक्षणित) पर भी काम नहीं करता है।
कैसिफ़स

2
न तो खिड़कियों पर 8 64 बिट
दासुन

5

किम्बो का जवाब सामान्य फाइलों के लिए एकदम सही है।

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

MsDos के लिए हार्डलिंक पर फ़ाइल नाम

के साथ बनाई गई कड़ी 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% \ बिन \ चिंगारी class2.cmd; लाइन 54
Broken: set RUNNER="%JAVA_HOME%\bin\java"
Windows Style: set "RUNNER=%JAVA_HOME%\bin\java"

अन्यथा, रनर उद्धरण के साथ समाप्त होता है, और कमांड "%RUNNER%" -Xmx128m ... डबल-कोट्स के साथ समाप्त होता है। नतीजा यह है कि प्रोग्राम और फ़ाइल को अलग-अलग मापदंडों के रूप में माना जाता है।



0

अगर एक बैच फ़ाइल उपयोग के माध्यम से:

set SHORT_DIR=%~dsp0%

आप जाँच करने के लिए इको कमांड का उपयोग कर सकते हैं:

echo %SHORT_DIR%

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.