Як прочитати вміст файлу в змінну в пакетному файлі?


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

Хоча цілком можливо, що туди не допускаються жодні шляхи УНК. Неможливо зараз перевірити це, але пам’ятайте про це.


4
setМетод читає тільки близько 1024 символів, чому це?
Юліан Онофрей

12
Можливо, через обмеження буфера в межах cmd. Це жахлива мова для надійних сценаріїв.
Joey

Я знаю, я боровся годинами, щоб замінити рядок у файлі: |
Юліан Онофрей

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

3
@Jan : for /f "usebackq" %%x in ("path with spaces.txt") .... help forце згадує, до речі.
Джой

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
robotik

Це рішення.
JAIL

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.