2013-03-15 11 views
9
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=a"') do (set usemenu=a) 
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=b"') do (set usemenu=b) 
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=c"') do (set usemenu=c) 

Dobrze, w tym kodzie (który może nie działać, że to, co próbuję się dowiedzieć) mamy ten "%% a" w tym poleceniu "dla".jaka jest różnica między: %% a% zmiennymi% zmiennych?

Po pierwsze, jaka jest różnica między% zmienną% a %% a?

Po drugie, czy ktoś może wyjaśnić mi polecenie "za"? Mam go za dużo i wszystkie wyjaśnienia wydają się być skomplikowane ...

Próbuję pobrać zmienną z options.txt, dzięki czemu mogę zmienić styl menu mojego launchera . są 3 style (a, b i c), więc jeśli plik options.txt brzmi "menu = a", jak mogę go ustawić, aby ustawić zmienną taką jak% usemenu% na wartość a?

Dzięki za pomoc z góry! Zmienne

Odpowiedz

27

to środowiskowe. Są one ustawiane za pomocą set i można je uzyskać za pomocą %foo% lub !foo! (z opóźnionym rozszerzeniem, jeśli jest włączone). %%a to zmienne specjalne tworzone za pomocą polecenia for w celu reprezentowania bieżącego elementu pętli lub tokena bieżącej linii.

for to prawdopodobnie najbardziej skomplikowana i potężna część plików wsadowych. Jeśli potrzebujesz pętli, to w większości przypadków obejmuje Cię for. help for ma podsumowanie.

Można

  • iteracyjnego plików: for %x in (*.txt) do ...
  • powtórzyć coś n razy: for /l %x in (1, 1, 15) do... (argumenty są początek, krok i koniec)
  • iteracyjne nad zestaw wartości: for %x in (a, b, c) do ...
  • iteracyjne nad liniami pliku: for /f %x in (foo.txt) do ...
  • linie tokenize z pliku: for /f "tokens=2,3* delims=," %x in (foo.txt) do ...
  • iteracyjnego wyjściu polecenia: for /f %x in ('somecommand.exe') do ...

To tylko krótki przegląd. Jest bardziej skomplikowany, ale przeczytaj pomoc.

Zmienne postaci %%a (lub %a jeśli for znajduje się poza plików wsadowych) są bardzo podobne do argumentów do plików wsadowych i podprogramów (%1, %2, ...). Można do nich zastosować niektóre rodzaje rozszerzeń, na przykład, aby uzyskać nazwę i rozszerzenie pliku, jeśli zmienna reprezentuje nazwę pliku ze ścieżką, której można użyć %%~nxa. Pełny przegląd tych informacji znajduje się w help for.

Z drugiej strony zmienne środowiskowe mają inne wyjątkowe cechy. Można wykonać w nich zamienniki za pomocą %foo:a=b%, co spowoduje, że zostanie zastąpiony przez a przez b. Możesz także brać podciągi: %foo:~4,2%.Opisy tych rzeczy można znaleźć w help set.

Jako dlaczego %variables% i %%a są różne rzeczy, że to trochę trudno odpowiedzieć i chyba tylko historyczne kuriozum. Jak wspomniano wyżej, istnieje trzeci rodzaj zmiennej, %1 itp., Które są bardzo podobne do tych używanych w for i istnieją już dłużej, jak sądzę. Ponieważ zmienne środowiskowe są nieco nieporęczne w użyciu w for ze względu na bloki, a tym samym duże uzależnienie od opóźnionego rozszerzenia, prawdopodobnie podjęto decyzję o użyciu tych samych mechanizmów, co w przypadku argumentów zamiast zmiennych środowiskowych.

także zmienne środowiskowe mogą być bardziej kosztowne, biorąc pod uwagę, że proces ma specjalny „środowisko” blok pamięci, gdzie są one przechowywane w variable=value␀ parach, więc aktualizację zmiennych środowiskowych obejmuje potencjalnie skopiowanie całego kawałka pamięci, gdy inny rodzaj zmienne mogą być bardziej lekkie. Jest to jednak spekulacja.


Co do problemu, to naprawdę nie trzeba for tutaj:

find /v ":" "%appdata%\gamelauncher\options.txt" | find "menu=a" && set usemenu=a 

To potrwa tylko set jeśli komenda poprzedzający był udany, tzn menu=a został znaleziony. To powinno być znacznie łatwiejsze niż for. Z tego, co przeczytałem, próbujesz sprawdzić, czy menu=a istnieje w wierszu, który nie zawiera dwukropka, i w takim przypadku usemenu powinno być ustawione na a, prawda? (Podobnie jak w przypadku b i c. Możesz spróbować namówić for do wykonania tej operacji poprzez zapętlenie linii pliku lub wyjścia i tokowanie w celu ustalenia wartości menu, ale w zależności od formatu linii może to być trudne. co masz tam działa w teorii, to należy po prostu trzymać się, że można jednak użyć pętli wokół niego w celu uniknięcia konieczności powtarzania tej samej linii trzykrotnie a, b i c.

for %%X in (a b c) do (
    find /v ":" "%appdata%\gamelauncher\options.txt" | find "menu=%%X" && set usemenu=%%X 
) 

Jeśli plik parsowanie jest proste, z zaledwie parami name=value w każdej linii, gdzie : foo byłby komentarzem, następnie mogłyby używać for także:

for /f "tokens=1,* eol=: delims==" %%A in (%appdata%\gamelauncher\options.txt) do (
    if "%%A"=="menu" set usemenu=%%B 
) 

Ale to zależy trochę na dokładny format pliku. Powyższy fragment będzie teraz odczytywał plik wiersz po wierszu i dla każdego wiersza odrzucił wszystko po dwukropku (opcja eol=:), użyj znaku równości jako ogranicznika tokena i przechwytuj dwa tokeny: Część przed pierwszą = i wszystko po niej. Tokeny mają nazwy zaczynające się od %%A, więc drugi to domyślnie %%B (ponownie, wyjaśniono to w help for). Teraz dla każdej linii sprawdzamy pierwszy token i sprawdzamy, czy jest to menu, a jeśli tak, przypisz jego wartość do zmiennej usemenu. Jeśli masz wiele możliwych opcji wsparcia, to z pewnością łatwiej je utrzymać :-).

+0

, w jaki sposób mogę użyć tego do rozwiązania mojego problemu z programem uruchamiającym gry? czy poprawnie używam tego polecenia? – magicbennie

+1

Tam jesteś :) – Joey