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


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.