Comparando parte de um nome de arquivo em um arquivo em lotes 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 é: mover o arquivo para a pasta correta, com base no segundo segmento do nome do arquivo (9100), portanto, se for maior que 9200, mova-o para uma pasta e, se não for, mova-o para outra pasta .
Dennis identificou um problema e forneceu uma solução em sua resposta. Mas ainda existem outros problemas.
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 já pode estar entre aspas; nesse caso, você deve remover as aspas antes de adicionar a sua usando, em "%~1"vez de "%1".
3) Talvez não seja um problema no seu caso, mas geralmente é uma boa idéia colocar caminhos de arquivo entre aspas, caso o nome contenha espaço ou caracteres especiais.
4) Suponho que você queira fazer uma comparação numérica. O comando SE 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 FI será revertido para uma comparação de cadeias de caracteres 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 seu nome de arquivo tiver potencial para 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\"
)
dbenham, Obrigado mesmo por esta solução brilhante! Funcionou imediatamente. / Rolf
user192750
1
Na verdade, você está comparando a string partial_namecom 9100, e nã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 à direita e à esquerda).
Para corrigir isso, %envolva o nome da variável com sinais de porcentagem ( ) e remova os espaços ao redor do sinal de 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\ )
Na verdade, você está comparando a string
partial_name
com9100
, e não o conteúdo da variável.Desde então
p GEQ 9
, isso será avaliado como verdadeiro.Além disso,
set partial_name = %%G
definepartial_name
como%%G
(observe os espaços à direita e à esquerda).Para corrigir isso,
%
envolva o nome da variável com sinais de porcentagem ( ) e remova os espaços ao redor do sinal de eual (=
):fonte