Как прочитать содержимое файла в переменную в пакетном файле?


161

Этот пакетный файл выпускает сборку из TEST в LIVE. Я хочу добавить проверочное ограничение в этот файл, которое гарантирует наличие соответствующего релиз-документа в определенной папке.

"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

Итак, у меня есть пара вопросов о том, как этого добиться ...

  1. В папке есть version.txtфайл \\testserver\testapp$, и единственным содержимым этого файла является номер сборки (например, 45 - для сборки 45). Как мне прочитать содержимое version.txtфайла в переменную в пакетном файле?

  2. Как проверить \\fileserver\myapp\releasedocs\ {build}.doc, существует ли файл, используя переменную из части 1 вместо {build}?

Ответы:


300

Считать содержимое файла в переменную:

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

или

set /p Build=<version.txt

Оба будут действовать одинаково только с одной строкой в ​​файле, для большего количества строк forвариант поместит последнюю строку в переменную, а set /pбудет использовать первую.

Используя переменную - как и любую другую переменную среды - она ​​одна, в конце концов:

%Build%

Итак, чтобы проверить наличие:

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

Хотя вполне может быть, что пути UNC там не разрешены. Не могу проверить это прямо сейчас, но имейте это в виду.


4
setМетод читает только около 1024 символов, почему это?
Юлиан Онофрей

12
Вероятно, из-за ограничений буфера внутри cmd. Это ужасный язык для надежных сценариев.
Джои

Я знаю, я часами пытался заменить строку в файле: |
Юлиан Онофрей

16
@IulianOnofrei, set /pвызывает cmd!ReadBufFromInputс выделенным стеком буфер для чтения 1023 широких символов (2046 байт). Он считывает из файла 1023 байта, предполагая 1 байт на символ OEM / ANSI, но декодирует файл с использованием текущей кодовой страницы, которая не обязательно является OEM / ANSI. В худшем случае это кодовая страница 65001 и файл, заполненный 4-байтовыми символами UTF-8 (например, древний скрипт). Вы получите 255 символов плюс частично декодированный символ, сохраненный в качестве символа замены, U + FFFD.
Eryk Sun

3
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") .... help forупоминает об этом, кстати.
Joey

46

Вы можете прочитать несколько переменных из файла следующим образом:

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

где param.txt:

PARAM1=value1
PARAM2=value2
...

1
это идеальное решение. чтобы буквально ответить на ОП, (param.txt)должно быть (version.txt)и должно содержатьсяBuild=45
роботик

Это решение.
17

3
%% G был неожиданным в это время.
Джон

4
@John: для использования непосредственно в командной строке замените каждый %%Gна%G
Stephan

32

просто сделать:

type version.txt

и он будет отображаться так, как будто вы набрали:

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

4
@ Jeb Я знаю это, но я все еще благодарен за команду типа, потому что это то, что мне было нужно
MSM

Спасибо за предоставление типовой версии. Работает именно для того, что мне нужно, доступ к содержимому файла, которые находятся в общем каталоге.
Tastybrownies

22

Чтобы загрузить все строки файла в переменную, требуется отложенное расширение, поэтому сделайте следующее:

SETLOCAL EnableDelayedExpansion

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

Существует проблема с некоторыми специальными символами, хотя особенно ;, %и!


Ограждающие все setвыражение в двойных кавычках может избежать проблем с по крайней мере некоторых специальных символов: set "Build=!Build!%%x".
aschipfl

9
Мой скрипт просто печатает "эхо включено". Почему пакетный мусор?
Тревор Хикки

У меня работает без отложенного расширения: set err=(следующая строка)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet

2
Почему пакетный мусор? ... для согласованности?
Ян Нильсен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.