Comparando parte de um nome de arquivo em um arquivo em lote do Windows

Comparando parte de um nome de arquivo em um arquivo em lote do Windows

Considere este roteiro:

SETLOCAL EnableDelayedExpansion
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name = %%G
 if partial_name GEQ 9200 ( move I:\rosa\transfertmp\%1  L:\OSLDos\Tmp\ ) else  ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ ) 
ENDLOCAL

invocado comothisscript 11111.9100.csv

O que eu quero fazer é: mover o arquivo para a pasta correta, com base no segundo segmento do nome do arquivo (9100), então se for maior que 9200 mova para uma pasta e se não for, mova para outra pasta .

O problema parece que a comparação não funciona.

Responder1

Dennis identificou um problema e forneceu uma solução em sua resposta. Mas ainda existem outras questões.

1) Seu código set partial_name = %%Gincluirá um espaço à direita no nome da variável e um espaço à esquerda no valor. O código deve lerset partial_name=%%G

2) Seu %1valor pode já estar entre aspas; nesse caso, você deve remover as aspas antes de adicionar o seu próprio usando "%~1"em vez de "%1".

3) Talvez não seja um problema no seu caso, mas geralmente é uma boa ideia colocar os caminhos dos arquivos entre aspas, caso o nome contenha espaço ou caracteres especiais.

4) Presumo que você queira fazer uma comparação numérica. O comando IF usa quase as mesmas regras que o comando SET /A quando tenta analisar um número - Qualquer número prefixado com 0 será tratado como notação hexadecimal. Se encontrar um dígito hexadecimal inválido como 8 ou 9, o IF reverterá para uma comparação de string em vez de uma comparação numérica.

Por exemplo if 09 lss 8 (echo true) else echo falseretorna true.

Portanto, se o segundo segmento do nome do arquivo tiver potencial para ter zeros à esquerda, você precisará trabalhar mais.

set "partial_name="
for /f "tokens=2 delims=." %%G in ("%~1") do (
  for /f "tokens=* delims=0" %%N in ("%%G") do set /a "partial_name=%%N"
  if not defined partial_name set "partial_name=0"
)
if %partial_name% GEQ 9200 (
  move "I:\rosa\transfertmp\%1" "L:\OSLDos\Tmp\"
) else (
  move "I:\rosa\transfertmp\%1" "L:\LdisOSLDos\Tmp\"
)

Responder2

Na verdade, você está comparando a string partial_name, 9100não o conteúdo da variável.

Desde então p GEQ 9, isso será avaliado como verdadeiro.

Além disso, set partial_name = %%Gdefine partial_name como  %%G(observe os espaços finais e iniciais).

Para corrigir ambos os problemas, coloque o nome da variável entre sinais de porcentagem ( %) e remova os espaços ao redor do sinal eual ( =):

for /F "tokens=2 delims=." %%G in ("%1") do set partial_name=%%G
 if %partial_name% GEQ 9200 ( move I:\rosa\transfertmp\%1  L:\OSLDos\Tmp\ ) else  ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )

informação relacionada