Verifique se uma variável corresponde ao início de outra em lote

0

Em um script em lote, preciso redirecionar o fluxo de script de acordo com o fato de uma variável corresponder ao início de outra. Particularmente, quero fazer algo assim:

IF %CD% BEGINSWITH %USERPROFILE% (Echo You can do stuff here!) ELSE (Echo You don't belong here!)

Eu tive dificuldade em encontrar algo para resolver este problema on-line, ou pelo menos qualquer coisa que faça sentido para mim. Se isso for possível, demonstre como e por que a solução viável funciona.

    
por Iszi 11.12.2013 / 19:36

2 respostas

1

A Resposta do Iszi frequentemente parece funcionar, mas pode dar resultados errados em muitas circunstâncias.

  • A pesquisa FINDSTR pode não corresponder corretamente se houver uma diferença no caso. Resolvido usando a opção /I .

  • FINDSTR tratará a cadeia de pesquisa como duas ou mais sequências de pesquisa, se o nome do perfil incluir um espaço. Melhor usar a opção /C:"searchString" .

  • FINDSTR fará uma pesquisa regex se %USERPROFILE% incluir um meta-caractere regex como . . Isso pode ser resolvido forçando uma pesquisa literal usando a opção /L ou a opção /C:"searchString" .

  • As barras invertidas podem ser um pouco complicadas com FINDSTR, pois são usadas pelo FINDSTR como um caractere de escape. Mais seguro para escapar de todas as barras invertidas como \ .

  • O comando ECHO pode falhar se o nome do diretório atual contiver um caractere especial como & . O comando CD imprimirá com segurança o diretório atual sem precisar se preocupar com caracteres especiais.

Além disso, como FINDSTR está sendo usado como teste e não há interesse em ver a linha correspondente, a saída deve ser redirecionada para NUL.

E, finalmente, a solução pode ser simplificada substituindo a instrução IF pelos operadores condicionais && e || .

O código a seguir deve sempre funcionar:

cd|findstr /bic:"%userprofile:\=\%" >nul&&echo You can do stuff here!||echo You don't belong here!

Atualização - Exemplo de caso de letra de unidade variável

Aqui está uma sessão do cmd.exe do Windows 7 que demonstra como o caso da letra da unidade relatada por CD (ou %CD% ) pode variar:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\>set userprofile
USERPROFILE=C:\Users\Dave

C:\>cd c:\users\Dave

c:\Users\Dave>cd
c:\Users\Dave

c:\Users\Dave>echo CD=%CD%
CD=c:\Users\Dave

c:\Users\Dave>cd..

c:\Users>cd C:\users\Dave

C:\Users\Dave>cd
C:\Users\Dave

C:\Users\Dave>echo CD=%CD%
CD=C:\Users\Dave

C:\Users\Dave>
    
por 12.12.2013 / 12:23
0

Acabei descobrindo por conta própria. Não sei bem por que não percebi essa solução em nenhum outro lugar.

ECHO %CD%|FINDSTR /B "%USERPROFILE%"
IF %ERRORLEVEL% EQU 0 (Echo You can do stuff here!) ELSE (Echo You don't belong here!)

Normalmente, FINDSTR procura por strings em um determinado arquivo de texto. No entanto, também pode aceitar entrada do pipeline. Aqui, usamos ECHO para colocar o diretório atual ( %CD% ) no pipeline e, em seguida, diz FINDSTR para procurar a pasta de perfil do usuário ( "%USERPROFILE%" - aspas obrigatórias) no início ( /B ) de os dados canalizados.

Como FINDSTR retorna um ERRORLEVEL , podemos verificar isso com uma instrução IF mais recente e, em seguida, proceder de acordo.

    
por 11.12.2013 / 21:38

Tags