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}?

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.


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
...

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%

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!


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.