Existe uma maneira em um script em lote do Windows retornar um caminho absoluto de um valor que contém um nome de arquivo e / ou caminho relativo?
Dado:
"..\"
"..\somefile.txt"
Eu preciso do caminho absoluto em relação ao arquivo em lotes.
Exemplo:
- "somefile.txt" está localizado em "C: \ Foo \"
- "test.bat" está localizado em "C: \ Foo \ Bar".
- O usuário abre uma janela de comando em "C: \ Foo" e chama
Bar\test.bat ..\somefile.txt
- No arquivo em lotes "C: \ Foo \ somefile.txt" seria derivado de
%1
windows
batch-file
relative-path
absolute-path
Nathan Taylor
fonte
fonte
realpath
para uma normalização de caminho robusta.SET FilePath=%CD%\%1
para que possa ser assimC:\Foo\Bar\..\..\some\other\dir\file.txt
. Os programas parecem entender um caminho tão complicado.Respostas:
Nos arquivos em lote, como nos programas C padrão, o argumento 0 contém o caminho para o script atualmente em execução. Você pode usar
%~dp0
para obter apenas a parte do caminho do argumento 0 (que é o script atual) - esse caminho é sempre um caminho totalmente qualificado.Você também pode obter o caminho completo do seu primeiro argumento usando
%~f1
, mas isso fornece um caminho de acordo com o diretório de trabalho atual, que obviamente não é o que você deseja.Pessoalmente, geralmente uso o
%~dp0%~1
idioma no meu arquivo em lotes, que interpreta o primeiro argumento em relação ao caminho do lote em execução. Porém, ele tem uma falha: falha miseravelmente se o primeiro argumento for totalmente qualificado.Se você precisar oferecer suporte a caminhos relativos e absolutos, poderá usar a solução de Frédéric Ménez : altere temporariamente o diretório de trabalho atual.
Aqui está um exemplo que demonstrará cada uma dessas técnicas:
Se você salvar isso como c: \ temp \ example.bat e executá-lo em c: \ Users \ Public como
c: \ Usuários \ Público> \ temp \ example.bat .. \ windows
... você observará a seguinte saída:
a documentação para o conjunto de modificadores permitidos em um argumento em lote pode ser encontrada aqui: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
fonte
%0
e da%1
mesma forma:%~dpnx0
para o caminho completo + nome do próprio arquivo em lote,%~dpnx1
para o caminho completo + nome do seu primeiro argumento [se for um nome de arquivo]. (Mas como na terra que você nomear um arquivo em uma unidade diferente se você não daria essa informação caminho completo na linha de comando afinal?)d:\foo\..\bar\xyz.txt
ainda pode ser normalizado. Eu recomendo usar essa abordagem com a resposta de @ axel-heider abaixo (usando uma sub-rotina em lote - você pode fazer isso em qualquer variável, não apenas em uma variável numerada).Me deparei com uma necessidade semelhante nesta manhã: como converter um caminho relativo em um caminho absoluto dentro de um script de comando do Windows.
O seguinte fez o truque:
fonte
pushd .
evita esse problema.A maioria dessas respostas parece louca por complicados e super bugs, aqui está a minha - ela funciona em qualquer variável de ambiente, nenhuma
%CD%
ouPUSHD
/POPD
oufor /f
bobagem - apenas funções simples de lote antigas. - O diretório e o arquivo nem precisam existir.fonte
%~f1
é apenas uma abreviação de%~dpfn1
- então, fique à vontade para usar%~f1
. 🙂 - no formato longo~
significa remover as aspas,d
significa dirigir,p
significa caminho,n
sozinho seria o nome do arquivo sem extensão, masfn
significa o nome do arquivo com extensão. o1
significa o primeiro argumento. - (Eu acredito que este formato antecede o Windows 7.)Sem ter que ter outro arquivo em lote para transmitir argumentos (e usar os operadores de argumento), você pode usar
FOR /F
:onde
i
in%%~fi
é a variável definida em/F %%i
. por exemplo. se você mudou para/F %%a
então a última parte seria%%~fa
.Para fazer a mesma coisa no prompt de comando (e não em um arquivo em lotes), substitua
%%
por%
...fonte
cd
comando não necessariamente alterar a%CD%
variável de ambiente (se, por exemplo, você está na unidadeD:
e seu caminho de destino está emC:
)cd /D D:\on.other.drive
FOR /F %%i IN ("..\relativePath") DO echo absolute path: %%~fi
falhará se..\relativePath
contiver espaços #for /?
sugere o uso de letras maiúsculas para nomes de variáveis, para evitar confusão com os parâmetros de substituição/F
não funcionará em caminhos que não existem e resolverá caracteres curinga. Se você quer isso, ótimo, mas se você quer a funcionalidade de/F
, basta usar atokens
palavra-chave:FOR /F "tokens=*" %%I IN ("..\relative Path\*") DO echo absolute path: %%~fI
Isso serve para ajudar a preencher as lacunas na resposta de Adrien Plisson (que deve ser votada assim que ele a editar ;-):
Pode-se lidar
%0
e da%1
mesma forma:%~dpnx0
para unidade qualificada + caminho + nome + extensão do próprio arquivo em lote,%~f0
também é suficiente;%~dpnx1
para drive totalmente qualificado + caminho + nome + extensão de seu primeiro argumento [se é que é um nome de arquivo],%~f1
também é suficiente;%~f1
funcionará independentemente de como você especificou seu primeiro argumento: com caminhos relativos ou com caminhos absolutos (se você não especificar a extensão do arquivo ao nomear%1
, ele não será adicionado, mesmo se você usar%~dpnx1
- no entanto.Mas como diabos você nomearia um arquivo em uma unidade diferente de qualquer maneira, se não desse essas informações de caminho completo na linha de comando?
No entanto,
%~p0
,%~n0
,%~nx0
e%~x0
pode vir a calhar, você deve estar interessado no caminho (sem driveletter), nome do arquivo (sem extensão), nome completo com extensão ou apenas a extensão do nome de arquivo. Mas observe, while%~p1
e%~n1
trabalhará para descobrir o caminho ou o nome do primeiro argumento%~nx1
e%~x1
não adicionar + mostrar a extensão, a menos que você já o tenha usado na linha de comando.fonte
%~dpnx1
é que ele fornece o caminho completo do argumento em relação ao diretório atual , enquanto o OP deseja o caminho em relação ao diretório em que o arquivo em lote reside .%~dpnx1
fornece um caminho totalmente qualificado para o 1º argumento. Não em relação a todos, e não em relação à dir atual também. Od
é para a unidade, op
é para o caminho, on
é para o nome do arquivo sem sufixo, ox
é para o sufixo e o1
é para o primeiro argumento. - E a pergunta de Nathan era: "Existe alguma maneira de retornar um caminho absoluto a partir de um valor que contém um nome de arquivo e / ou caminho relativo?"Você também pode usar funções em lote para isso:
fonte
Pequena melhoria na excelente solução do BrainSlugs83 . Generalizado para permitir nomear a variável de ambiente de saída na chamada.
Se executar a partir da
C:\project
saída for:fonte
Não vi muitas soluções para esse problema. Algumas soluções fazem uso de passagem de diretório usando CD e outras fazem uso de funções em lote. Minha preferência pessoal foi pelas funções em lote e, em particular, pela função MakeAbsolute , conforme fornecida pelo DosTips.
A função tem alguns benefícios reais, principalmente porque ela não altera seu diretório de trabalho atual e, em segundo lugar, que os caminhos que estão sendo avaliados nem precisam existir. Você pode encontrar algumas dicas úteis sobre como usar a função aqui também.
Aqui está um exemplo de script e suas saídas:
E a saída:
Espero que isso ajude ... Com certeza me ajudou :) PS Mais uma vez obrigado ao DosTips! Você é demais!
fonte
Você pode apenas concatená-los.
parece estranho com \ .. \ no meio do seu caminho, mas funciona. Não há necessidade de fazer nada louco :)
fonte
echo %~dp0..\SomeFile.txt
No seu exemplo, em Bar \ test.bat, DIR / B / S .. \ somefile.txt retornaria o caminho completo.
fonte
Atualmente, o PowerShell é bastante comum, então eu o uso frequentemente como uma maneira rápida de invocar o C #, pois ele possui funções para praticamente tudo:
É um pouco lento, mas é difícil superar a funcionalidade obtida, a menos que seja necessário recorrer a uma linguagem de script real.
fonte
A solução da stijn trabalha com subpastas em
C:\Program Files (86)\
,fonte
Arquivos Veja todas as outras respostas
Diretórios
Com
..
sendo o seu caminho relativo, e supondo que você está atualmente emD:\Projects\EditorProject
:cd .. & cd & cd EditorProject
(o caminho relativo)retorna caminho absoluto, por exemplo
D:\Projects
fonte
fonte