Windows 경로 대신 DOS 경로 가져 오기


99

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

답변:


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

더 간단한 방법이 있습니까?


2
이것은 매우 절뚝 거리고 도움이됩니다.
elgabito 2011-09-21

좋아요.하지만 디렉토리 이름을 포함시키는 방법은 무엇입니까?
Marcos

3
내 대답을 찾았습니다. for /d %I in (*) do @echo %~sI 모든 경로 세그먼트는 짧고 훌륭합니다. 문제는 긴 이름이나 공백조차도 고통스럽지 않지만,이 디렉토리 목록을 입력으로 가져가는 내 스크립트에 단순히 호스를 넣는 국제 문자가 존재할 때 최악입니다.
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

Windows 배치 스크립트에서 %~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

다른 멍청이가이 영리한 솔루션을 발견하는 경우 : 스크립트는 첫 번째 매개 변수가 비어 있는지 확인합니다. 그렇다면 스크립트가 다시 실행되지만 이번에는 현재 디렉터리를 첫 번째 인수로 사용합니다 ( %0는 배치 스크립트의 경로 이름).
Sinjai

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 # 프로그램을 좋아합니다.
Eniola

API 용 MSDN 페이지 : GetShortPathName
Amro

7

실행 cmd.exe하고 다음을 수행하십시오.

> cd "long path name"
> command

그러면 command.com이 나타나 짧은 경로 만 표시합니다.

출처


18
Windows 7에는 최소한 x64 버전이 아닌 command.com이 없습니다.
Timbo

2
위의 내용은 Win7 32 비트에서 작동합니다. 방금했습니다. 그러나 당신 말이 맞습니다. 64 비트에서는 작동하지 않습니다.
cssyphus 2013

2
Windows 8 64 비트에는 없음
Dasun 2013 년

5

Kimbo의 답변은 일반 파일에 적합합니다.

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

HardLinks의 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 % \ bin \ spark-class2.cmd; 54 행
Broken: set RUNNER="%JAVA_HOME%\bin\java"
Windows Style: set "RUNNER=%JAVA_HOME%\bin\java"

그렇지 않으면 RUNNER는 따옴표로 "%RUNNER%" -Xmx128m ... 끝나고 명령 은 큰 따옴표로 끝납니다. 그 결과 프로그램과 파일이 별도의 매개 변수로 취급됩니다.



0

배치 파일을 사용하는 경우 :

set SHORT_DIR=%~dsp0%

echo 명령을 사용하여 다음을 확인할 수 있습니다.

echo %SHORT_DIR%

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.