Bir toplu iş dosyasındaki bir değişkene dosya içeriği nasıl okunur?


161

Bu toplu iş dosyası TEST'ten LIVE'a bir sürüm yayınlar. Bu dosyaya belirli bir klasörde saydam bir sürüm belgesi olmasını sağlayan bir kontrol kısıtlaması eklemek istiyorum.

"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

Bunu başarmak için birkaç sorum var ...

  1. Klasörde bir version.txtdosya var \\testserver\testapp$ve bu dosyanın tek içeriği yapı numarasıdır (örneğin, 45 - yapı 45 için) version.txtDosyanın içeriğini toplu iş dosyasında bir değişkene nasıl okurum ?

  2. \\fileserver\myapp\releasedocs\ {build}.doc{Build} yerine bölüm 1'deki değişkeni kullanarak bir dosyanın var olup olmadığını nasıl kontrol edebilirim ?

Yanıtlar:


300

Dosya içeriğini bir değişkene okuyun:

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

veya

set /p Build=<version.txt

Her ikisi de dosyadaki tek bir satırla aynı şekilde hareket eder, daha fazla satır için forvaryant son satırı değişkene koyarken ilk satırı set /pkullanır .

Değişkeni kullanmak - tıpkı diğer ortam değişkenleri gibi - sonuçta birdir:

%Build%

Varlığı kontrol etmek için:

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

Her ne kadar orada UNC yollarına izin verilmese de. Bunu şu anda test edemiyorum ama aklınızda bulundurun.


4
setYöntem yalnızca bu yüzden, 1024 karakter hakkında okur?
Iulian Onofrei

12
Muhtemelen içindeki bir tamponun sınırları nedeniyle cmd. Güvenilir komut dosyaları için korkunç bir dildir.
Joey

Biliyorum, bir dosyada bir dize değiştirmek için saatlerce mücadele etti: |
Iulian Onofrei

16
@IulianOnofrei, 1023 geniş karakteri (2046 bayt) okumak için yığın tahsisli bir tamponla set /pçağırır cmd!ReadBufFromInput. OEM / ANSI karakteri başına 1 bayt olduğu varsayılarak dosyadan 1023 bayt okur, ancak OEM / ANSI olması gerekmeyen geçerli kod sayfasını kullanarak dosyanın kodunu çözer. En kötü durum, kod sayfası 65001 ve 4 bayt UTF-8 karakterleri (örneğin eski bir komut dosyası) ile dolu bir dosyadır. 255 karakter artı ikame karakter olarak saklanan kısmen deşifre edilmiş bir karakter olan U + FFFD elde edersiniz.
Eryk Sun

3
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") .... help forbu arada bundan bahsediyor.
Joey

46

Dosyadan şu şekilde birden çok değişkeni okuyabilirsiniz:

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

burada param.txt:

PARAM1=value1
PARAM2=value2
...

1
bu mükemmel bir çözüm. kelimenin tam anlamıyla OP cevap, (param.txt)olmalı (version.txt)ve içermelidirBuild=45
robotik

Bu çözüm.
JAIL

3
%% G şu anda beklenmedikti.
John

4
Doğrudan komut satırında kullanılmak üzere, her değiştirin: @John %%Gile%G
Stephan

32

sadece yap:

type version.txt

yazdığınız gibi görüntülenecektir:

set /p Build=<version.txt
echo %Build%

4
@jeb biliyorum ama im hala tip komutu için minnettarım çünkü thats ne gerekli
MSM

Yazım sürümünü sağladığınız için teşekkür ederiz. Tam olarak ihtiyacım olan şey için çalışır, paylaşılan bir dizindeki dosya içeriğine erişir.
Tastybrownies

22

Dosyanın tüm satırlarını değişkene yüklemek için Gecikmeli Genişletme gerekir, bu nedenle aşağıdakileri yapın:

SETLOCAL EnableDelayedExpansion

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

Bazı özel karakterler ile ilgili bir sorun olduğunu, özellikle olsa ;, %ve!


Tüm Çevreleyen setçift tırnak içinde ifade en azından sorunlarını önlemek olabilir bazı özel karakterler: set "Build=!Build!%%x".
aschipfl

9
Betiğim sadece "echo is ON" yazıyor. Parti neden tam çöp?
Trevor Hickey

Gecikmeli Genişleme olmadan benim için çalışıyor: set err=(sonraki satır)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet

2
Parti neden tam çöp? ... tutarlılık için mi?
Jan Nielsen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.