Como definir para uma variável o resultado de uma expressão

Como definir para uma variável o resultado de uma expressão

Preciso extrair a data de um arquivo e depois usar essa string como parte do nome de um novo arquivo. Tentei resolver isso usando os próximos comandos:

Primeiro obtenho os detalhes do arquivo e redireciono a saída para um arquivo temporário.

DIR c:/myfolder/thefile.txt >> tmp.txt

Então eu uso o FINDSTR para pegar a linha que contém a data, se existir uma forma de pegar apenas a data que não encontrei:

FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

A saída é:

10/04/2012 07:55 66,029 thefile.txt

Agora quero definir este resultado para uma variável:

SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

Parece que funcionou, pois quando coloco %vartmp% retorna o resultado:

10/04/2012 07:55 66,029 thefile.txt

Mas quando tento extrair uma parte do vartmp, começam os problemas:

ECHO %vartmp:~0,2%

Está me retornando a string "FI" quando eu esperava "10", parece que o vartmp está salvando a expressão e não o resultado da expressão, estou tentando atribuir o resultado da expressão para uma outra tempvar, depois extrair uma substring de tempvar mas nada mudou.

Responder1

O comando FOR pode ser usado para dividir uma linha em tokens para que você possa pegar apenas a parte desejada. Com /f você pode executá-lo na saída de outros comandos, neste caso a saída do DIR filtrada com FIND.

for /f "tokens=1" %%a in ('dir thefile.txt ^| Find "thefile.txt"') do (
set vartmp=%%a
)

Responder2

Não é o ideal, mas pode mudar SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txtpara

FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt > tmp2.txt
SET /p vartmp =< tmp2.txt
DEL tmp2.txt

Responder3

Ao seguir seus exemplos, encontrei o mesmo resultado se substituísse a linha:

SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

com

for /f %i in ('FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt') do set vartmp=%i

então vartmp contém o que você procura. Observe que você precisa de aspas simples, aspas duplas não funcionarão. Além disso, se estiver usando um arquivo em lote, você precisará de %%i no lugar de %i

informação relacionada