Bagaimana cara membaca konten file menjadi variabel dalam file batch?

161

File batch ini merilis build dari TEST ke LIVE. Saya ingin menambahkan batasan periksa dalam file ini yang memastikan ada dokumen rilis yang menyertainya dalam folder tertentu.

"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

Jadi saya punya beberapa pertanyaan tentang bagaimana mencapai ini ...

  1. Ada version.txtfile di \\testserver\testapp$folder, dan satu-satunya isi file ini adalah nomor build (misalnya, 45 - untuk build 45) Bagaimana cara membaca konten version.txtfile menjadi variabel dalam file batch?

  2. Bagaimana cara memeriksa apakah file,, \\fileserver\myapp\releasedocs\ {build}.docada menggunakan variabel dari bagian 1 sebagai pengganti {build}?

pengguna23048345
sumber

Jawaban:

300

Baca konten file ke dalam variabel:

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

atau

set /p Build=<version.txt

Keduanya akan bertindak sama dengan hanya satu baris dalam file, untuk lebih banyak baris forvarian akan menempatkan baris terakhir ke dalam variabel, sementara set /pakan menggunakan yang pertama.

Menggunakan variabel - sama seperti variabel lingkungan lainnya - itu adalah satu, setelah semua:

%Build%

Jadi untuk memeriksa keberadaan:

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

Meskipun mungkin tidak ada jalur UNC yang diizinkan di sana. Tidak dapat menguji ini sekarang, tetapi ingatlah ini.

Joey
sumber
4
The setMetode hanya membaca tentang 1024 karakter, mengapa demikian?
Iulian Onofrei
12
Mungkin karena batas buffer di dalamnya cmd. Ini adalah bahasa yang mengerikan untuk skrip yang andal.
Joey
Saya tahu, saya berjuang berjam-jam untuk mengganti string dalam file: |
Iulian Onofrei
16
@IulianOnofrei, set /ppanggilan cmd!ReadBufFromInputdengan buffer yang dialokasikan untuk membaca 1023 karakter lebar (2046 bytes). Bunyinya 1023 byte dari file, dengan asumsi 1 byte per karakter OEM / ANSI, tapi itu decode file menggunakan codepage saat ini, yang belum tentu OEM / ANSI. Kasing terburuk adalah codepage 65001 dan file diisi dengan 4-byte karakter UTF-8 (misalnya naskah kuno). Anda akan mendapatkan 255 karakter, ditambah karakter yang diterjemahkan sebagian yang disimpan sebagai karakter pengganti, U + FFFD.
Eryk Sun
3
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") .... help formenyebutkan ini, omong-omong.
Joey
46

Anda dapat membaca banyak variabel dari file seperti ini:

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

di mana param.txt:

PARAM1=value1
PARAM2=value2
...
xnagyg
sumber
1
ini solusi sempurna. untuk benar-benar menjawab OP, (param.txt)harus (version.txt)dan itu harus berisiBuild=45
robotik
Ini adalah yang solusi.
JAIL
3
%% G tidak terduga saat ini.
John
4
@ John: untuk digunakan langsung pada baris perintah, ganti setiap %%Gdengan%G
Stephan
32

kerjakan saja:

type version.txt

dan itu akan ditampilkan seolah-olah Anda mengetik:

set /p Build=<version.txt
echo %Build%
psrcek
sumber
4
@ jeb saya tahu itu tetapi saya masih berterima kasih atas perintah ketik karena itulah yang saya butuhkan
MSM
Terima kasih telah menyediakan versi jenisnya. Bekerja tepat untuk apa yang saya butuhkan, mengakses konten file yang ada di direktori bersama.
Tastybrownies
22

Untuk mendapatkan semua baris file dimuat ke dalam variabel, Perluasan Tertunda diperlukan, jadi lakukan hal berikut:

SETLOCAL EnableDelayedExpansion

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

Ada masalah dengan beberapa karakter khusus, meskipun terutama ;, %dan!

DPS
sumber
Melampirkan seluruh setekspresi dalam tanda kutip ganda bisa menghindari masalah dengan setidaknya beberapa karakter khusus: set "Build=!Build!%%x".
aschipfl
9
Script saya hanya mencetak "echo is ON". Mengapa kumpulan sampah lengkap?
Trevor Hickey
Bekerja untuk saya tanpa Ekspansi Tertunda: set err=(baris berikutnya)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet
2
Mengapa kumpulan sampah lengkap? ... untuk konsistensi?
Jan Nielsen