Como anexar com segurança um nome de arquivo a um argumento de caminho de pasta do Windows?
Suponha que eu tenho um script em lote que espera um caminho de pasta no argumento%1
. Quero anexar um nome de arquivo ao caminho e usá-lo em um comando. Existe uma maneira simples de fazer isso de maneira confiável em todas as situações?
eu não queroPUSHD %1
e simplesmente ignore o caminho posteriormente. Suponha que minha lógica exija que o diretório atual permaneça inalterado.
A questão é a%1
o argumento pode ou não ter uma barra invertida final - ou seja,c:\path
ouc:\path\
.
Normalmente eu posso simplesmente usar"%~1\file.ext"
porque o Windows trata"c:\path\file.ext"
e"c:\path\\file.ext"
identicamente.
Mas há um caso desagradável -c:\
Os seguintes comandos produzem este erro:The filename, directory name, or volume label syntax is incorrect.
dir "c:\\file.ext"
del "c:\\file.ext"
O estranho é que esses comandos funcionam bem:
if exist "c:\\file.ext" echo OK
echo text>"c:\\file.ext"
copy "c:\\file.ext" "somePath"
xcopy "c:\\file.ext" "somePath"
Há outro caso problemático -c:
, significando que o diretório atual na unidade C :, dará o resultado errado se eu adicionar uma barra invertida."c:file.ext"
não é o mesmo que"c:\file.ext"
.
Existe uma maneira simples de anexar com segurança um nome de arquivo a qualquer argumento do caminho da pasta?
Não estou preocupado com os caminhos UNC, pois não os uso com muita frequência e acredito que existem alguns comandos que não funcionam bem com os caminhos UNC.
Nota: Este é um caso em que estou postando uma pergunta e resposta emparelhadas. Esse problema tem sido um problema para mim há vários anos e, recentemente, descobri uma solução simples que achei interessante para outras pessoas.