Como ler o conteúdo do arquivo em uma variável em um arquivo em lotes?

161

Esse arquivo em lotes libera uma compilação do TEST para o LIVE. Desejo adicionar uma restrição de verificação neste arquivo que garanta a existência de um documento de liberação da empresa em uma pasta específica.

"C:\Program Files\Windows Resource Kits\Tools\robocopy.exe" "\\testserver\testapp$"        
"\\liveserver\liveapp$" *.* /E /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP
del "\\liveserver\liveapp$\web.config"
ren "\\liveserver\liveapp$\web.live.config" web.config

Então, eu tenho algumas perguntas sobre como conseguir isso ...

  1. Há um version.txtarquivo na \\testserver\testapp$pasta, e o único conteúdo desse arquivo é o número da compilação (por exemplo, 45 - para a compilação 45) Como leio o conteúdo do version.txtarquivo em uma variável no arquivo em lotes?

  2. Como verifico se \\fileserver\myapp\releasedocs\ {build}.docexiste um arquivo usando a variável da parte 1 no lugar de {build}?

user23048345
fonte

Respostas:

300

Leia o conteúdo do arquivo em uma variável:

for /f "delims=" %%x in (version.txt) do set Build=%%x

ou

set /p Build=<version.txt

Ambos agirão da mesma forma com apenas uma única linha no arquivo; para mais linhas, a forvariante colocará a última linha na variável, enquanto set /pusará a primeira.

Usando a variável - como qualquer outra variável de ambiente - ela é uma, afinal:

%Build%

Então, para verificar a existência:

if exist \\fileserver\myapp\releasedocs\%Build%.doc ...

Embora seja possível que nenhum caminho UNC seja permitido lá. Não é possível testar isso agora, mas lembre-se disso.

Joey
fonte
4
O setmétodo lê apenas cerca de 1024 caracteres, por que isso?
Iulian Onofrei
12
Provavelmente devido aos limites de um buffer dentro cmd. É uma linguagem horrível para scripts confiáveis.
Joey
Eu sei, lutei por horas para substituir uma string em um arquivo: |
Iulian Onofrei
16
@IulianOnofrei, set /pchama cmd!ReadBufFromInputcom um buffer alocado de pilha para ler 1023 caracteres largos (2046 bytes). Ele lê 1023 bytes do arquivo, assumindo 1 byte por caractere OEM / ANSI, mas decodifica o arquivo usando a página de código atual, que não é necessariamente OEM / ANSI. O pior caso é a página de código 65001 e um arquivo preenchido com caracteres UTF-8 de 4 bytes (por exemplo, um script antigo). Você receberá 255 caracteres, além de um caractere parcialmente decodificado armazenado como o caractere de substituição, U + FFFD.
Eryk Sun
3
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") .... help formenciona isso, a propósito.
Joey
46

Você pode ler várias variáveis ​​do arquivo como este:

for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H

em que param.txt:

PARAM1=value1
PARAM2=value2
...
xnagyg
fonte
1
Esta é a solução perfeita. literalmente responder a OP, (param.txt)deve ser (version.txt)e deve conterBuild=45
robotik
Essa é a solução.
JAIL 12/04
3
%% G foi inesperado no momento.
John
4
@ John: para uso diretamente na linha de comando, substitua todos os %%Gcom%G
Stephan
32

apenas faça:

type version.txt

e será exibido como se você digitasse:

set /p Build=<version.txt
echo %Build%
psrcek
fonte
4
@jeb eu sei disso, mas eu ainda estou grato pelo comando tipo porque isso é o que eu precisava
MSM
Obrigado por fornecer a versão do tipo. Funciona exatamente para o que eu preciso, acessando o conteúdo do arquivo que está em um diretório compartilhado.
Tastybrownies
22

Para obter todas as linhas do arquivo carregadas na variável, é necessária a Expansão atrasada, assim como o seguinte:

SETLOCAL EnableDelayedExpansion

for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x

Há um problema com alguns caracteres especiais, embora especialmente ;, %e!

DPS
fonte
Colocando toda a setexpressão dentro aspas duplas poderia evitar problemas com, pelo menos, alguns caracteres especiais: set "Build=!Build!%%x".
precisa saber é o seguinte
9
Meu script apenas imprime "o eco está ativado". Por que o lote é lixo completo?
precisa saber é o seguinte
Obras para me sem expansão atrasada: set err=(próxima linha)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet
2
Por que o lote é lixo completo? ... por consistência?
Jan Nielsen