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.