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}?

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.


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

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%

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!


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.