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

1

Considere este script:

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 como thisscript 11111.9100.csv

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

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

    
por user192750 25.01.2013 / 12:14

2 respostas

1

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

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

2) Seu valor %1 já pode ter sido citado. Nesse caso, você deve remover as aspas antes de adicionar as suas próprias usando "%~1" em vez de "%1" .

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

4) Eu estou supondo que você quer 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 false retorna true .

Portanto, se o segundo segmento do seu nome de arquivo tiver o potencial de ter zeros à esquerda, você precisará fazer mais trabalho.

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\"
)
    
por 25.01.2013 / 13:46
1

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

Como p GEQ 9 , isso será avaliado como verdadeiro.

Além disso, set partial_name = %%G define partial_name  a  %%G (espaços à direita e à esquerda).

Para corrigir os dois problemas, coloque o nome da variável com 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\ )
    
por 25.01.2013 / 12:49