Làm thế nào để đọc nội dung tệp thành một biến trong một tệp bó?


161

Tệp bó này phát hành bản dựng từ TEST đến LIVE. Tôi muốn thêm một ràng buộc kiểm tra trong tệp này để đảm bảo có một tài liệu phát hành kèm theo trong một thư mục cụ thể.

"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

Vì vậy, tôi có một vài câu hỏi về cách đạt được điều này ...

  1. Có một version.txttệp trong \\testserver\testapp$thư mục và nội dung duy nhất của tệp này là số bản dựng (ví dụ: 45 - cho bản dựng 45) Làm cách nào để đọc nội dung của version.txttệp thành một biến trong tệp bó?

  2. Làm cách nào để kiểm tra xem một tệp \\fileserver\myapp\releasedocs\ {build}.doccó tồn tại bằng cách sử dụng biến từ phần 1 thay cho {build} không?

Câu trả lời:


300

Đọc nội dung tệp thành một biến:

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

hoặc là

set /p Build=<version.txt

Cả hai sẽ hoạt động giống nhau chỉ với một dòng duy nhất trong tệp, đối với nhiều dòng hơn, forbiến thể sẽ đặt dòng cuối cùng vào biến, trong khi set /psẽ sử dụng dòng đầu tiên.

Sử dụng biến - giống như bất kỳ biến môi trường nào khác - nó là một, sau tất cả:

%Build%

Vì vậy, để kiểm tra sự tồn tại:

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

Mặc dù có thể là không có đường dẫn UNC nào được phép ở đó. Không thể kiểm tra điều này ngay bây giờ nhưng hãy ghi nhớ điều này.


4
Các setphương pháp duy nhất đọc khoảng 1.024 ký tự, tại sao vậy?
Iulian Onofrei

12
Có lẽ là do giới hạn của một bộ đệm trong cmd. Đó là một ngôn ngữ khủng khiếp cho các kịch bản đáng tin cậy.
Joey

Tôi biết, tôi đã vật lộn hàng giờ để thay thế một chuỗi trong một tệp: |
Iulian Onofrei

16
@IulianOnofrei, set /pcác cuộc gọi cmd!ReadBufFromInputvới bộ đệm được cấp phát ngăn xếp để đọc 1023 ký tự rộng (2046 byte). Nó đọc 1023 byte từ tệp, giả sử 1 byte cho mỗi ký tự OEM / ANSI, nhưng nó giải mã tệp bằng cách sử dụng bảng mã hiện tại, không nhất thiết phải là OEM / ANSI. Trường hợp xấu nhất là codepage 65001 và một tệp chứa đầy các ký tự UTF-8 4 byte (ví dụ: tập lệnh cổ). Bạn sẽ nhận được 255 ký tự, cộng với một ký tự được giải mã một phần được lưu dưới dạng ký tự thay thế, U + FFFD.
Eryk CN

3
@Jan : for /f "usebackq" %%x in ("path with spaces.txt") .... help forNhân tiện, đề cập đến điều này.
Joey

46

Bạn có thể đọc nhiều biến từ tệp như thế này:

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

trong đó param.txt:

PARAM1=value1
PARAM2=value2
...

1
Đây là giải pháp hoàn hảo. để trả lời theo nghĩa đen của OP, (param.txt)nên (version.txt)và nó nên chứaBuild=45
robotik

Đây là những giải pháp.
Jail

3
%% G là bất ngờ tại thời điểm này.
Giăng

4
@ John: để sử dụng trực tiếp trên dòng lệnh, thay thế mọi thứ %%Gbằng%G
Stephan

32

cứ làm đi:

type version.txt

và nó sẽ được hiển thị như thể bạn đã gõ:

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

4
@jeb tôi biết điều đó nhưng tôi vẫn biết ơn lệnh loại vì đó là những gì tôi cần
MSM

Cảm ơn bạn đã cung cấp phiên bản loại. Hoạt động chính xác cho những gì tôi cần, truy cập nội dung tệp trên thư mục dùng chung.
Tastybrownies

22

Để có được tất cả các dòng của tệp được tải vào biến, Mở rộng bị trì hoãn là cần thiết, do đó, hãy làm như sau:

SETLOCAL EnableDelayedExpansion

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

Có một vấn đề với một số nhân vật đặc biệt, mặc dù đặc biệt ;, %!


Việc bao gồm toàn bộ setbiểu thức trong dấu ngoặc kép có thể tránh được các vấn đề với ít nhất một số ký tự đặc biệt : set "Build=!Build!%%x".
aschipfl

9
Kịch bản của tôi chỉ in "echo là ON". Tại sao hàng loạt rác hoàn chỉnh?
Trevor Hickey

Hoạt động cho tôi mà không bị trì hoãn mở rộng: set err=(dòng tiếp theo)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet 16/03/18

2
Tại sao hàng loạt rác hoàn chỉnh? ...cho thống nhất?
Jan Nielsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.