Como posso encontrar o caminho curto de um diretório / arquivo do Windows?

73

Preciso usar nomes abreviados de caminho para um aplicativo que estou usando. Por exemplo, eu preciso C:\PROGRA~1\, ao contrário C:\Program Files. O programa não pode manipular espaços e não aceita caminhos entre aspas (por exemplo "C:\Program Files").

Se ajudar, estou usando o Windows 7. Posso acessar qualquer versão desde o XP, se necessário.

somehume
fonte

Respostas:

77

Clique em Iniciar e digite cmdna caixa de execução. Inicie o cmd e use-o cdpara acessar a pasta em que você está interessado:

cd \

Então

dir /x

C:\>dir /x

13/10/2011  09:14 AM    <DIR>          DOCUME~1     Documents and Settings
13/10/2011  09:05 AM    <DIR>          PROGRA~1     Program Files
Paulo
fonte
Então você faz isso para todas as subpastas no caminho?
Endolith
@endolith O /sinterruptor faz subpasta recursão
Paul
11
Quero dizer, como você exibe o caminho 8.3 inteiro?
Endolith
4
@ Paul Isso parece não funcionar no Win10. Alguma ideia?
AHungerArtist
3
@AHungerArtist Os nomes curtos dos arquivos não existem necessariamente; sua criação pode ser desativada.
Hipponax43
37

Crie um arquivo bat em algum diretório conveniente e copie + cole o caminho curto desse caminho.

Você também pode executar command.come continuar executando cdcomandos no seu diretório atual.

Nos scripts em lote do Windows, %~s1expande os parâmetros do caminho para nomes abreviados . Crie este arquivo em lote:

@ECHO OFF
echo %~s1

Liguei para o meu shortNamePath.cmde chamo assim:

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

Aqui está uma versão que usa o diretório atual se nenhum parâmetro foi fornecido:

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

Chamado sem parâmetros:

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

Usando SETe uma variável nomeada

O Prompt de Comando do Windows possui algumas convenções para lidar com variáveis ​​com espaços em seus valores que são um pouco difíceis de aprender e entender, especialmente se você tiver um plano de fundo do Unix. Você pode fazer

SET TESTPATH=c:\Program Files (x86)\Android\android-sdk

( sem aspas ) ou

SET "TESTPATH=c:\Program Files (x86)\Android\android-sdk"

(observe a colocação não intuitiva de aspas); então

CALL :testargs "%TESTPATH%"

:testargs
echo %~s1
goto :eof
SSpoke
fonte
6
Realmente útil, deve ser marcado como resposta!
Lucaferrario #
Obrigado! É possível usar um comando SET? como SET AAA = C: \ Program Files \ o que sempre \ outro espaço no meio \ para a versão curta
Li3ro
@ Li3ro Não consegui descobrir o modo de comando variável SET, mas cheguei bem perto, você pode vê-lo na parte inferior da resposta, só precisa de uma pequena correção. Eu não gosto de programação de scripts em lote, então não sei como.
SSpoke
Não é possível assim. você precisa do loop for para este
Li3ro
Esta é mais útil do que a resposta aceita
EvilTeach
8

Aqui está um liner :

cmd /c for %A in ("C:\Program Files") do @echo %~sA

Repartição :

  • cmd /c - Inicia uma nova instância do interpretador de comandos do Windows, executa o comando especificado por string e finaliza
  • for %%parameter in (set) do comando - execute condicionalmente um comando várias vezes.
  • echo- Exibir mensagens na tela. @O símbolo é o mesmo que ECHO OFFaplicado somente à linha atual.
  • %~s - Caminho expandido contém apenas nomes abreviados.

Fontes :

Ivan Schwarz
fonte
11
Agradável!!! Você pode substituir "C: \ Arquivos de Programas" por. obter o nome abreviado do diretório atual
Andrew Steitz 18/17
11
Quando / por que você precisaria do cmd /c? Se você estiver em uma janela do prompt de comando, basta digitar o for %A in ("C:\Program Files") do @echo %~sAcomando e, se você digitar na caixa de diálogo "Executar", o resultado desaparecerá antes que você possa lê-lo.
2828 Scott
2
Bem feito; como o @Scott aponta, você não precisa do cmd /cquando estiver fugindo cmd; você precisa do PowerShell , mas também precisa '...'encerrar os tokens após /c:cmd /c 'for %f in ("C:\Program Files") do @echo %~sf'
mklement0
8

O "nome abreviado" é realmente a antiga convenção de nomenclatura do DOS 8.3; portanto, todos os diretórios serão as primeiras 6 letras seguidas ~1assumindo que existe apenas um nome que corresponda, por exemplo:

C:\ABCDEF~1    - C:\ABCDEFG I AM DIRECTORY
C:\BCDEFG~1    - C:\BCDEFGHIJKL M Another Directory

aqui é a única exceção

C:\ABCDEF~1    - C:\ABCDEFG I AM DIRECTORY
C:\ABCDEF~2    - C:\ABCDEFGHI Directory as well
freedenizen
fonte
6
Não é verdade. Às vezes, menos caracteres são usados, principalmente se você estiver usando caracteres asiáticos, como coreano.
Arafangion
11
Suponho que descobrir qual é qual, no caso "excepcional" é o ponto da questão - especialmente como a "exceção" ocorre regularmente em cada instalação do Windows de 64 bits, onde você pode precisar de saber que um em cada Program Filese Program Files (x86)é PROGRA~1e quais um é PROGRA~2. A resposta de Paulo resolve esse problema.
OR Mapper
2
Eu tenho tantos arquivos que começam com os mesmos caracteres que, após quatro deles ( ...~4), começaram com o que parece ser hash, por exemplo, ABxxxx~1onde x era hexadecimal - o que não é muito fácil de ler.
Sirap
2
Você está sugerindo que o usuário possa descobrir logicamente os nomes abreviados observando os nomes longos? Isso não é verdade. Se eu criar ABCDEFGH-CAT, ele receberá um nome abreviado ABCDEF~1. Se eu criar ABCDEFGH-DOG, o nome será abreviado ABCDEF~2. Se eu, em seguida, apagar ABCDEFGH-CAT, ABCDEFGH-DOG, ainda tem nome curto ABCDEF~2. Não há como saber apenas olhando os nomes longos.
28518 Scott
como dito, o nome abreviado não precisa ser as 6 primeiras letras mais ~1. Veja a regra que o Windows usa para gerar nomes abreviados . E você também pode definir manualmente o nome abreviado fsutil, para que os dois nomes não tenham relação alguma.
Muito menos
4

Encontrei uma maneira muito útil de resolver o caminho curto do diretório atual (ou qualquer outra coisa) se você tiver o Powershell instalado.

Basta abrir o PowerShell no diretório atual

  • no cmd janelas digite powershell

  • se você tiver uma pasta aberta no gui, poderá digitar cmd.exe ou powershell.exe diretamente na barra de endereços da pasta.

Então dê comando

(New-Object -ComObject Scripting.FileSystemObject).GetFolder(".").ShortPath

Origem das informações: [ https://gallery.technet.microsoft.com/scriptcenter/Get-ShortName-90a49303]

Eino Mäkitalo
fonte
3

Semelhante à resposta de Ivan Schwartz , você pode substituir "C: \ Arquivos de Programas" por %cd%para obter o diretório atual:

cmd /c for %A in ("%cd%") do @echo %~sA  
Eino Mäkitalo
fonte
0

Como alternativa, você poderia usar esta pequena ferramenta chamada PathCopyCopy

Em alguns cliques, você pode obter o caminho longo e curto de literalmente qualquer pasta no menu contextual, por exemplo:

Clique com o botão direito do mouse na pasta de destino => Path Copy => Short Path.

Feito. Será copiado para a sua área de transferência.

pré-visualização

Asamoah
fonte
0

Eu instalei módulos de nó executando npm installem um clichê. Ao tentar excluir essas pastas, o Windows não nos permite excluí-las, pois o caminho é muito longo para podermos lidar.

Depois de algumas pesquisas superficiais, pensei que seria correto meu trecho de código renomear as pastas da raiz para a folha, para que também gerasse qualquer exceção de violação para essa tentativa.

Funciona para mim. A seguir está o código para o projeto C #.

    public static int directoryCounterIndex = 0;
    public static void Main(string[] args)
    {
        string dirPath = @"D:\Studies\MeanStack\a\nodem";
        RenameDirectories(dirPath);
    }

    private static void RenameDirectories(string dirPath)
    {
        directoryCounterIndex += 1;
        var newPath = Path.GetDirectoryName(dirPath) + Path.DirectorySeparatorChar + directoryCounterIndex.ToString();
        Directory.Move(dirPath, newPath);
        var subDirectories = Directory.GetDirectories(newPath);
        foreach (var subDirectory in subDirectories)
        {
            RenameDirectories(subDirectory);
        }
    }
Ashok
fonte
3
Por favor, leia a pergunta novamente com atenção. Sua resposta não responde à pergunta original.
DavidPostill
0
C:\Users\abcd>subst z: "c:\Program Files (x86)\Microsoft Office365 Tools\Microsoft Visual Studio 14.0"

C:\Users\abcd>subst
Z:\: => C:\Program Files (x86)\Microsoft Office365 Tools\Microsoft Visual Studio 14.0"

Essa é a maneira mais fácil que eu usei ao lidar com arquivos com espaços e também pode ser acessada pelo explorador de arquivos e possui os mesmos privilégios de acesso.

Santhosh Kumar
fonte
-2

Apenas substitua os espaços por

%20

É assim que as coisas são "traduzidas" e os espaços entram em% 20.

Se você realmente precisa de muito, basta abrir o navegador e digitar algo como

test ";($#< and find the word test, and see that the space is %20 and so on...
user556501
fonte
Eu não acho que você esteja certo. Isso não produz um resultado positivo:if exist C:\Program%20Files\ (echo exists)
kayleeFrye_onDeck 26/09
3
Você está falando sobre algo completamente diferente. O ponto principal é que os nomes de diretório e arquivo são truncados para 8 caracteres. O navegador não tem nada a ver com isso.
Dawid Ferenczy Rogožan