Dans une fenêtre DOS, comment puis-je obtenir le nom DOS complet/le nom abrégé du répertoire dans lequel je me trouve?
Par exemple, si je suis dans le répertoire C:\Program Files\Java\jdk1.6.0_22
, Je veux afficher son nom abrégé C:\PROGRA~1\Java\JDK16~1.0_2
.
Je sais courir dir /x
me donnera les noms abrégés des fichiers/répertoires du répertoire actuel, mais je n’ai pas trouvé le moyen d’afficher le chemin complet du répertoire actuel sous forme de nom abrégé. Je dois parcourir le chemin depuis la racine, répertoire par répertoire, en cours d'exécution dir /x
dans chaque.
Je suis sûr qu'il y a un moyen plus facile de faire ça?
for %I in (.) do echo %~sI
Un moyen plus simple?
Vous pouvez également entrer les informations suivantes dans une fenêtre CMD:
dir <ParentDirectory> /X
Où <ParentDirectory>
Est remplacé par le chemin complet du répertoire contenant l'élément pour lequel vous souhaitez attribuer un nom.
Bien que la sortie ne soit pas aussi simple que réponse de Timbo , elle répertorie tous les éléments du répertoire spécifié avec le nom réel et (s’il est différent) le nom abrégé.
Si vous utilisez for %I in (.) do echo %~sI
, vous pouvez remplacer le .
Par le chemin complet du fichier/dossier pour obtenir le nom abrégé de ce fichier/dossier (sinon, le nom abrégé du dossier actuel est revenu).
Testé sur Windows 7 x64.
Dans les scripts batch de Windows, %~s1
étend les paramètres de chemin aux noms abrégés . Créez ce fichier batch:
@ECHO OFF
echo %~s1
J'ai appelé le mien shortNamePath.cmd
et appelez ça comme ça:
c:\>shortNamePath "c:\Program Files (x86)\Android\android-sdk"
c:\PROGRA~2\Android\ANDROI~1
Edit: voici une version qui utilise le répertoire actuel si aucun paramètre n'a été fourni:
@ECHO OFF
if '%1'=='' (%0 .) else echo %~s1
Appelé sans paramètres:
C:\Program Files (x86)\Android\android-sdk>shortNamePath
C:\PROGRA~2\Android\ANDROI~1
Être un programmeur a fait ce projet Winform de 10 minutes. Cela m'a été utile. Faire de cette application un menu contextuel pour l'explorateur de fichiers éviterait davantage de clics.
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;
}
}
courir cmd.exe
et procédez comme suit:
> cd "long path name"
> command
Ensuite, command.com apparaîtra et n’affichera que des chemins courts.
La réponse de Kimbo est parfaite pour les fichiers normaux.
for %I in (.) do echo %~sI
Les liens durs créés avec mklink /H <link> <target>
n'aura pas de nom de fichier court MsDos.
Au cas où vous dir /X
et vous découvrez ce nom abrégé manquant, vous devez vous attendre aux éléments suivants:
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
Dans ce cas
> for %I in ("2013-12-22--12-10-42------Bulevardul-Petrochimiștilor.jpg") do echo %~sI
J'ai ce que j'attendais
d:\personal\PH124E~1\2013-P~3\2013-1~1.JPG
Dans ce cas
> for %I in ("2013-12-22--12-10-52------Bulevardul-Petrochimiștilor.jpg") do echo %~sI
J'ai le chemin normal de MsDos mais le nom de fichier normal.
d:\personal\PH124E~1\2013-P~3\2013-12-22--12-10-52------Bulevardul-Petrochimiștilor.jpg`
Une réponse plus directe est de corriger le bogue.
% SPARK_HOME%\bin\spark-class2.cmd; Ligne 54Broken: set RUNNER="%Java_HOME%\bin\Java"
Windows Style: set "RUNNER=%Java_HOME%\bin\Java"
Sinon, le RUNNER se termine par des guillemets et la commande "%RUNNER%" -Xmx128m ...
se termine par des guillemets doubles. Le résultat est que le programme et le fichier sont traités comme des paramètres distincts.
semblable à ceci réponse mais utilise une sous-routine
@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