Expansão da variável de ambiente em lote quando a variável termina com uma barra invertida?

2

Eu só preciso perguntar se isso é um comportamento esperado, mas com certeza me surpreendeu.

Temos um arquivo em lotes que copia alguns arquivos de um subdiretório de onde ele está localizado para outro local em todas as máquinas dos desenvolvedores. Como para alguns desenvolvedores, esse diretório de destino é diferente do restante, definimos uma variável de ambiente do usuário e usamos isso no arquivo em lote.

Esta é uma linha de amostra do arquivo de lote:

ROBOCOPY Staging\*.* "%DISTRIBUTE_TARGET%" *.* /IS

Isso falhou em uma máquina, e depois de alguma experimentação, ocorreu-me que nessa máquina, a variável tinha uma barra invertida como parte do conteúdo variável.

Na maioria das máquinas (na verdade, em todas as outras máquinas, onde funcionava), a variável era assim:

DISTRIBUTE_TARGET=C:\Some\Directory

mas nesta máquina, foi:

DISTRIBUTE_TARGET=C:\Some\Directory\

observe a barra invertida adicionada lá.

A mensagem de erro dada por ROBOCOPY era de que havia algo errado com o segundo parâmetro, mas parecia pensar que tudo, desde o início dessa variável, até o final da linha, estava no segundo parâmetro. / p>

Ou seja. a mensagem de erro ficou assim:

Error in second parameter: "C:\Some\Directory\" *.* /IS"

O que eu suponho que aconteceu é que a barra invertida "escapou" do caractere de citação, que removeu seu significado como "fim do parâmetro citado" e, assim, o resto da linha foi apenas capturado como parte do argumento.

Esse comportamento é esperado? Isso significa que as variáveis com uma barra invertida, por qualquer motivo ou finalidade, simplesmente não podem ser usadas com segurança?

    
por Lasse Vågsæther Karlsen 07.01.2010 / 13:06

2 respostas

2

Deste artigo :

If either the source or destination are a "quoted long foldername" do not include a trailing backslash as this will be treated as an escape character, i.e. "C:\some path\" will fail but "C:\some path\" or "C:\some path" will work.

Este é um problema específico para o robocopy. Eu até chegaria a chamar isso de bug.

Você não tem outra solução a não ser adicionar código ao seu arquivo de lote que verificará e excluirá uma barra invertida do final da origem e do destino.

    
por 07.01.2010 / 13:20
5

Na verdade, isso não é específico para o robocopy, mas sim para o CommandLineToArgvW Função da API do Windows.

CommandLineToArgvW has a special interpretation of backslash characters when they are followed by a quotation mark character ("), as follows:

2n backslashes followed by a quotation mark produce n backslashes followed by a quotation mark.

(2n) + 1 backslashes followed by a quotation mark again produce n backslashes followed by a quotation mark.

n backslashes not followed by a quotation mark simply produce n backslashes.

As mesmas regras são descritas em Argumentos da linha de comando de C ++

Uma solução alternativa é anexar . a tudo que você sabe que é um diretório (por exemplo, "C:\Program Files\." )

    
por 14.11.2011 / 20:21