Como definir / usar um valor de string vazia em uma variável na linha de comando do Windows XP CMD.EXE?

5

Usar SET para definir um valor vazio para uma variável funciona bem em um script .CMD do Windows XP. No entanto, o mesmo comando SET se comporta de maneira diferente no mesmo interpretador CMD quando usado diretamente a partir da linha de comando:

Tentando testá-lo em uma linha de comando CMD.EXE:

C:\>set Q=

C:\>echo %Q%
%Q%

C:\>echo "%Q%"
"%Q%"

C:\>set Q=/Q

C:\>echo %Q%
/Q

C:\>echo "%Q%"
"/Q"

Tentando testá-lo com um script .CMD como este:

set Q=
echo %Q%
echo "%Q%"
set Q=/Q
echo %Q%
echo "%Q%"

Executando:

C:\>c.cmd

C:\>set Q=

C:\>echo
ECHO is on.

C:\>echo ""
""

C:\>set Q=/Q

C:\>echo /Q
/Q

C:\>echo "/Q"
"/Q"

O que estou perdendo?

É uma piada legal de Redmond, ou há alguma explicação sensata para essa diferença?

Como devo testar linhas de um script .CMD quando elas se comportam de maneira diferente quando usadas em uma linha de comando?

Como faço para definir corretamente uma variável como um valor de string vazia em uma linha de comando do CMD e como faço referência a essa variável para obter essa string vazia?

    
por Laszlo Valko 17.12.2013 / 23:59

4 respostas

4

tl; dr - Problema que você tem aí é que echo %Q% se expande para echo . Use echo.%Q%

Resposta expandida

O comando

echo tem 4 comportamentos:

  • echo on - ativa comandos de eco.
  • echo off - desativa os comandos de eco.
  • echo - mostra o estado da opção de comandos de eco.
  • echo ... - coloca ... e nova linha na tela.

Se você passar a variável para echo como argumento e ela estiver vazia, ela será expandida para echo e mostrará algo como "ECHO está desativado".

Muitas pessoas usam o comando echo. para exibir uma string vazia (read: output newline), mas nem todo mundo sabe que echo. pode ser usado para especificar explicitamente que você deseja um comportamento de saída. por exemplo:

  • echo.on - produzirá on e nova linha
  • echo.off - produzirá off e nova linha
  • echo. - produzirá nova linha
  • echo.something - produzirá something e nova linha
  • echo.%Q% - produzirá conteúdo de %Q% , estando ou não "" / "on" / "off" ou qualquer outra coisa.

Lembre-se de que não deve haver espaço entre . e argumentos.

Veja o link

    
por 13.09.2014 / 18:38
2

Enquanto você pode verificar se uma variável está vazia ou não, se você quiser concatenar uma variável para uma string com suporte para valores vazios / nulos, uma possível solução seria para o prefixo todos os seus valores com um caractere fictício e pule esse caractere sempre que você usar essa variável:

set q=0
set q2=%q:~1%string

teste:

set q=0_
echo %q%
echo %q:~1%concat%q:~1%

set q=0
echo %q%
echo %q:~1%concat%q:~1%

O resultado será _concat_ no primeiro caso e concat no segundo.

    
por 13.09.2016 / 01:36
1

@Laszlo Valko: Você não diz qual CP você usa, mas eu "falsifico" a variável vazia usando Alt-255, que é um caractere "invisível", pelo menos no CP 437. Usando o seu exemplo:

@echo off
::The line below contains the invisible character (Alt-255)
echo Q set to "Invisible"
set Q= 
set Q
echo %Q%
echo "%Q%"
echo Q set to Empty
set Q=
set Q
echo %Q%
echo "%Q%"
echo Q set to "/Q"
set Q=/Q
set Q
echo %Q%
echo "%Q%"

Usar SET Q mostrará todas as variáveis que começam com Q. Experimente SET C e você verá o que quero dizer. Como você pode ver, quando a variável está em branco, ela é excluída. Quando você faz um ECHO %Q% , o interpretador de comandos pensa que você está apenas dizendo ECHO , que então informa o estado: Ativado ou Desativado. Como usei @echo off no início do script, ele informa que o eco está desativado.

Espero que ajude!

    
por 17.01.2014 / 22:24
0

Eu encontrei exatamente o mesmo problema no meu script. Atualmente, não encontrei uma maneira de definir uma variável como string vazia. Acabei de descobrir como inicializá-lo com um espaço:

set "Var= "

Essas aspas são opcionais. Mas eles realmente ajudam a ver esse espaço explicitamente e preservá-lo no caso de procedimentos de limpeza de espaço em branco terminal.

Mais informações podem ser encontradas aqui: comando SET .

    
por 16.08.2016 / 00:55