Jak wczytać zawartość pliku do zmiennej w pliku wsadowym?

161

Ten plik wsadowy zwalnia kompilację z TEST do LIVE. Chcę dodać ograniczenie sprawdzające w tym pliku, które zapewni, że w określonym folderze znajduje się towarzyszący dokument wersji.

"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

Mam więc kilka pytań, jak to osiągnąć ...

  1. W folderze znajduje się version.txtplik \\testserver\testapp$, a jedyną zawartością tego pliku jest numer kompilacji (na przykład 45 - dla kompilacji 45) Jak wczytać zawartość version.txtpliku do zmiennej w pliku wsadowym?

  2. Jak sprawdzić, czy plik \\fileserver\myapp\releasedocs\ {build}.docistnieje, używając zmiennej z części 1 zamiast {build}?

user23048345
źródło

Odpowiedzi:

300

Wczytaj zawartość pliku do zmiennej:

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

lub

set /p Build=<version.txt

Oba będą działać tak samo z tylko jedną linią w pliku, w przypadku większej liczby linii forwariant umieści ostatnią linię w zmiennej, podczas gdy set /pużyje pierwszej.

Używając zmiennej - tak jak każdej innej zmiennej środowiskowej - jest ona przecież jedną:

%Build%

Aby sprawdzić istnienie:

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

Chociaż może się zdarzyć, że żadne ścieżki UNC nie są tam dozwolone. Nie można tego teraz przetestować, ale pamiętaj o tym.

Joey
źródło
4
setMetoda czyta tylko około 1024 znaków, to dlaczego?
Iulian Onofrei
12
Prawdopodobnie ze względu na ograniczenia bufora wewnątrz cmd. To okropny język dla wiarygodnych skryptów.
Joey,
Wiem, godzinami walczyłem, aby zastąpić ciąg znaków w pliku: |
Iulian Onofrei
16
@IulianOnofrei, set /pwywołuje cmd!ReadBufFromInputbufor przydzielony na stosie w celu odczytania 1023 szerokich znaków (2046 bajtów). Odczytuje 1023 bajty z pliku, zakładając 1 bajt na znak OEM / ANSI, ale dekoduje plik przy użyciu bieżącej strony kodowej, która niekoniecznie jest OEM / ANSI. Najgorszym przypadkiem jest strona kodowa 65001 i plik wypełniony 4-bajtowymi znakami UTF-8 (np. Starożytny skrypt). Otrzymasz 255 znaków plus częściowo zdekodowany znak przechowywany jako znak zastępczy, U + FFFD.
Eryk Sun
3
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") .... help forwspomina o tym, nawiasem mówiąc.
Joey,
46

Możesz odczytać wiele zmiennych z pliku w następujący sposób:

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

gdzie param.txt:

PARAM1=value1
PARAM2=value2
...
xnagyg
źródło
1
to jest idealne rozwiązanie. aby dosłownie odpowiedzieć na OP, (param.txt)powinno być (version.txt)i powinno zawieraćBuild=45
robotik
To rozwiązanie.
JAIL
3
%% G było w tym czasie nieoczekiwane.
John
4
@John: do stosowania bezpośrednio na linii poleceń, należy wymienić każdy %%Gz%G
Stephan
32

po prostu zrób:

type version.txt

i będzie wyświetlany tak, jakbyś wpisał:

set /p Build=<version.txt
echo %Build%
psrcek
źródło
4
@jeb Wiem o tym, ale nadal jestem wdzięczny za polecenie typu, ponieważ tego właśnie potrzebowałem
MSM
Dziękujemy za podanie wersji typu. Działa dokładnie na to, czego potrzebuję, uzyskując dostęp do zawartości plików znajdujących się w katalogu udostępnionym.
Tastybrownies
22

Aby załadować wszystkie wiersze pliku do zmiennej, potrzebne jest opóźnione rozwinięcie, więc wykonaj następujące czynności:

SETLOCAL EnableDelayedExpansion

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

Jest problem z niektórych znaków specjalnych, choć przede wszystkim ;, %i!

DPS
źródło
Załączając całą setekspresję wewnątrz podwójnych cudzysłowów mógł uniknąć problemów z przynajmniej niektórych znaków specjalnych: set "Build=!Build!%%x".
aschipfl
9
Mój skrypt wyświetla po prostu „echo jest włączone”. Dlaczego partia jest kompletnym śmieciem?
Trevor Hickey
Działa dla mnie bez opóźnionego rozszerzenia: set err=(następna linia)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet
2
Dlaczego partia jest kompletnym śmieciem? ... dla spójności?
Jan Nielsen