Editado para corrigir o regex conforme comentário do debham . Acontece que adicionar um espaço antes do pipe após o echo adiciona um espaço à string canalizada, que foi o que quebrou o início / fim da linha correspondente anteriormente. O regex pode ser melhorado, descartando-se o espaço em branco no início e no final.
Existe o comando findstr
. Ele pode pesquisar arquivos com expressões regulares, muito parecido com grep
no Linux. Também pode pesquisar a entrada canalizada.
@echo off
set param=%1
echo %param%| findstr /r "^[1-9][0-9]*$">nul
if %errorlevel% equ 0 (
echo Valid number
)
Explicação
O parâmetro usado é definido na variável param
. No entanto, não há nada que o impeça de usar o parâmetro diretamente ( %1
para o primeiro parador).
findstr
é usado para pesquisar a entrada canalizada com o sinal /r
para regex.
O padrão:
-
^
significa início de linha. -
[0-9]
significa um dígito. O*
significa o zero repetido anterior ou mais vezes. Então,[0-9][0-9]*
significa um dígito, mais zero ou mais dígitos. Em outras palavras, pelo menos um dígito. O+
uma ou mais vezes parece não ser suportado porfindstr
. Observe que[1-9]
é usado para o primeiro dígito para não permitir zeros à esquerda - consulte os comentários. -
$
significa fim de linha.
Agora, um loop for em lote para x número de vezes ... se x não for um número válido, o loop na verdade não será executado - apenas é pulado para a próxima linha. Portanto, não há necessidade de verificar se a entrada é um número válido!
@echo off
set param=%1
for /l %%a in (1,1,%param%) do (
echo %%a
)
O loop é feito usando for /l
, onde (x,y,z)
significa iniciar em x
, incrementar em y
até que z
seja atingido. E define %%a
para o número / iteração atual.
Nota: isso realmente falha se houver um zero à esquerda, fazendo com que o processador de comandos o trate como um número octal. Veja a resposta do dbenham para uma melhor solução.