[BATCH] Pętla for i inkrementacja - ja powiązać?


(andrzejt17) #1

Witam ponownie,

Znów mam problem, potrzebuję przypisać każdą linie tektu do podobnych zmiennych (var1, var2 ...) za pomocą for. Chcę by na końcu pętli była inkrementacja (zwiększona wartość o 1) zmiennej, która jest zaraz po var. Oto kod:

set /a C=0

FOR /F "eol=; tokens=1,2* delims==" %%i in (file.txt) do (set var%C%=%%i=%%j & set /a C=%C% + 1)

Problem tym, że powyższy kod nie chce działać, bawiłem się z nim kilkadziesiąt minut i nigdy nie chce mi się zrobić var1=1tokenzpliku=2tokenzpliku tylko zawsze mam var0 i tam jej wartość z pliku. Macie jakieś pomysły?


([alex]) #2

set /?

poczytaj opis przykładu:

for %i in (*) do set LIST=!LIST! %i


(andrzejt17) #3

Skumałem ale nie chce działać ;/

D:\testy\lol>/V:ON

Nazwa pliku, nazwa katalogu lub składnia etykiety woluminu jest niepoprawna.

Jak spisuje w uruchom cmd /V:ON i odnoszę się do pliki bat, gdzie mam tą pętlę to i tak efektu nie ma ;/

set /a C=0

FOR /F "eol=; tokens=1,2* delims==" %%i in (file.txt) do echo %C% & set /a C=!C! + 1

albo

set /a C=0

FOR /F "eol=; tokens=1,2* delims==" %%i in (file.txt) do echo !C! & set /a C=%C% + 1

Jak w pliku wpiszę na początku /V:ON to też lipa. Nie mam pojęcia jak to rozgryźć ;x


([alex]) #4

echo !C! & set /a C=!C! + 1


(andrzejt17) #5

No looz, działa pięknie ale jest jedno ale. Jak uruchamiam cmd z przełącznikiem /V:ON i odwołuję się do bata to działa ale je chce, żeby to V:ON działało w pliku wsadowym. czy napisze na początku V:ON czy /V:ON to i tak inkrementacja nie działa bi nie chce się włączyć opóźnione rozwijanie zmiennych...


([alex]) #6

cmd /?

Opóźnione rozwijanie zmiennych środowiskowych NIE jest włączone domyślnie.

Opóźnione rozwijanie zmiennych środowiskowych dla poszczególnych wywołań

programu CMD.EXE można włączać lub wyłączać przy użyciu przełącznika /V:ON

lub /V:OFF. Można włączać lub wyłączać opóźnione rozwijanie dla wszystkich

wywołań programu CMD.EXE na komputerze i/lub sesji logowań użytkownika przez

ustawienie w rejestrze jednej lub obu następujących wartości REG_DWORD

za pomocą programu REGEDT.EXE:

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion

i/lub

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

na 0x1 albo 0x0. Ustawienie określone przez użytkownika ma pierwszeństwo

przed ustawieniem komputera. Przełączniki wiersza polecenia mają

pierwszeństwo przed ustawieniami rejestru.


(andrzejt17) #7

Czytałem to. Z tym, że program będzie uruchamiany na różnych komputerach (ściśle nieokreślonej grupie użytkowników) więc edycja rejestru nie wchodzi w grę. Znalazłem za to inne rozwiązanie.

if .%1. equ .. (goto runagain) else (goto initiation)


:initiation

if %1 equ -r (goto runapp) else (echo Nieprawidlowe wywolanie polecenia wewnetrznego & pause & exit)


:runagain

start cmd /v:on /c app.bat -r

exit


:runapp

:: uruchmia dalej skrypt

Lepsze to niż nic, jednak jeśli wiedział by ktoś jak zastosować /v w bacie to proszę o odpowiedź :wink:

THX za udzieloną pomoc.


([alex]) #8

można prościej:

set V=on

set V=!V!

if .%V%.==.on. goto runapp

cmd /V:ON /c %0

exit

:runapp


(V3vie) #9

Rozwiązaniem problemu z wykonaniem w skrypcie jest ustawienie w nim

setlocal EnableDelayedExpansion

Więcej informcji można znaleść w http://ss64.com/nt/setlocal.html

Pozdrawiam,