Получить путь DOS вместо пути Windows
В окне DOS, как я могу получить полное имя DOS / краткое имя каталога, в котором я нахожусь?
Например, если я нахожусь в каталоге C:\Program Files\Java\jdk1.6.0_22
Я хочу показать это короткое имя C:\PROGRA~1\Java\JDK16~1.0_2
,
Я знаю бег dir /x
даст мне короткие имена файлов / каталогов в текущем каталоге, но я не смог найти способ отобразить полный путь текущего каталога в формате короткого имени. Мне приходится прокладывать путь из корня, каталог за каталогом, запускать dir /x
в каждом.
Я уверен, что есть более простой способ сделать это?
12 ответов
Вы также можете ввести следующее в окно CMD:
dir <ParentDirectory> /X
куда <ParentDirectory>
заменяется полным путем к каталогу, содержащему элемент, название которого вы хотите получить.
Хотя вывод не так прост, как ответ Тимбо, он перечислит все элементы в указанном каталоге с фактическим именем и (если отличается) коротким именем.
Если вы используете for %I in (.) do echo %~sI
Вы можете заменить .
с полным путем к файлу / папке, чтобы получить краткое имя этого файла / папки (в противном случае возвращается короткое имя текущей папки).
Проверено на Windows 7 x64.
В пакетных сценариях 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
Будучи программистом, сделал этот 10-минутный проект Winform. Это было полезно для меня. Превращение этого приложения в контекстное меню для файлового менеджера позволит сэкономить больше кликов.
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;
}
}
Бежать cmd.exe
и сделайте следующее:
> cd "long path name"
> command
Затем появится command.com и отобразит только короткие пути.
Ответ Кимбо идеально подходит для обычных файлов.
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`
Кто-то более прямой ответ должен исправить ошибку.
% SPARK_HOME% \ искровым class2.cmd бин \; Линия 54Broken: set RUNNER="%JAVA_HOME%\bin\java"
Windows Style: set "RUNNER=%JAVA_HOME%\bin\java"
В противном случае, RUNNER заканчивается кавычками, а команда"%RUNNER%" -Xmx128m ...
заканчивается двойными кавычками. В результате программа и файл обрабатываются как отдельные параметры.
Если через командный файл использовать:
set SHORT_DIR=%~dsp0%
вы можете использовать команду echo, чтобы проверить:
echo %SHORT_DIR%
$fso = New-Object -com scripting.filesystemobject
$fso.GetFolder('c:\Program Files (x86)').ShortName()
PROGRA~2
Похож на этот ответ, но использует подпрограмму
@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
Поместите этот скрипт где-нибудь на пути к Windows. Я позвонил своему
getshort.bat
и поместил в папку System32.
Чтобы использовать это, вы должны передать один параметр пути после вызова скрипта в окне cmd.exe.
Итак, откройте cmd.exe и введите что-то вроде
getshort.bat "C:\folder\file name with spaces.ext"
Вы должны заключать пути в двойные кавычки с пробелами, в противном случае в этом нет необходимости.
Сценарий возьмет указанный вами путь и сохранит короткое имя во временном текстовом файле с двумя версиями: в версии 1 короткий путь заключен в кавычки, а в другой версии нет.
Я использую блокнот ++ для открытия файлов txt, поэтому, если вы не используете эту программу, вам нужно изменить строку
START "" /MAX NOTEPAD++ "%TMP%\Test.txt"
и заменить
notepad++
с именем вашего редактора.
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
COLOR 0A
:----------------------------------------------------------------------------------
REM SET THE CD VARIABLE EQUAL TO THE FIRST PARAMATER YOU PASSED THE SCRIPT
:: ..WHICH WAS A FILE PATH OF YOUR CHOOSING...
CD=%1
:----------------------------------------------------------------------------------
:: DELETE ANY LEFTOVERS FROM PRIOR RUNS
IF EXIST "%TMP%\Test.txt" DEL /F /Q "%TMP%\Test.txt"
:----------------------------------------------------------------------------------
:: USE THE FOR COMMAND TO CALL A SUBROUTINE TO STORE THE SHORT NAMES WITH AND WITHOUT QUOTES
FOR %%1 IN ("%CD%") DO (
SET ARG1="%%~s1"
SET ARG2=%%~s1
CALL :CREATE_TXTFILE ARG1 ARG2
START "" /MAX NOTEPAD++ "%TMP%\Test.txt"
GOTO :EOF
)
:----------------------------------------------------------------------------------
REM USE THIS SUB-ROUTINE TO STORE THE SHORTNAMES INSIDE THE A TXT FILE
:CREATE_TXTFILE
(
ECHO %ARG1%
ECHO %ARG2%
)>"%TMP%\Test.txt"
:: THE NEXT LINE WILL RETURN THE SCRIPT TO THE LINE BELOW THE CALL COMMAND ABOVE AND CONTINUE EXECUUTION AS NORMAL
:: NOTEPAD++ WILL ATTEMPT TO FIND AND OPEN THE NEWLY CREATED TXT FILE WITH THE SHORTNAMES INSIDE
:: CHANGE TO WHATEVER TEXT EDITOR YOU HAVE TO OPEN TXT FILES IF YOU DONT HAVE NOTEPAD++
EXIT /B
Воспользуйтесь этой ссылкой, она автоматически преобразует любой путь, который вы указали, в любой формат https://pathconverter-pp.azurewebsites.net/