Czy używając cmd można w jakiś sposób zamienić okreslony wyraz w zmienną, która będzie używa w następnym poleceniu?
Załóżmy, że mam jakiś plik tekstowy, w ktorym mam ciągi wyrazów, np. nazwa mojego konta użytkownika. Chciałbym, żeby skrypt pod warunkiem, że znajdzie moje konto nada mu odpowiednie uprawnienia. Mam problem z “wyłuskaniem” z pliku tekstowego zadanego ciagu znaków. Chciałbym przypisać zmienną “S” jako “mój login”, a następnie wykorzystać “S” w następnych poleceniach.
FOR /F “tokens=* delims=” %%G IN (‘find “mój login” *.txt’) DO set S=%%G && if %S%==“mój login” goto Write_permissions
Niestety powyższe rozwiązanie nie działa. Zastnawiam się też czy w cmd istnieje cos takiego jak zmienna globalna, która będize rozpoznawalna w całym skrypcie?
Tak na szybko, bo nie analizowałem Twojego skryptu (i czy on jest poprawny) - jeśli przetarzasz w pętli dane i przypisujesz je do tej samej zmiennej, dla odczytania jej bieżącej wartości używaj !S! a nie %S% - może to pomoże?
z tym, że jak taka zmienna znajduje się w pętli for, to należy używać tej drugiej formy !S!, bo ona zawiera bieżącą wartość (dodatkowo należy włączyć EnableDelayedExpansion).
Uruchom sobie ten skrypt:
for %%G in (1 2 3 4 5) do (
set F=%%G
echo %F%
)
Zauważysz, że zmienna %F% ma zawsze wartość 5 - czyli złą (niezgodną z logiką).
A teraz uruchom ten skrypt:
SETLOCAL EnableDelayedExpansion
for %%G in (1 2 3 4 5) do (
set F=%%G
echo !F!
)
Ja też przy skryptach linii poleceń korzystam często z serwisu http://ss64.com. Kiedyś przejrzałem pobierznie większość opisanych poleceń, pamiętam że przy którymś było coś na ten temat (jest np. tutaj: http://ss64.com/nt/delayedexpansion.html).
Nie wiem dokładnie, jakiej postaci plik tekstowy chcesz przeszukiwać, ale ja użyłbym tu polecenia _ for /f _ (z odpowiednimi parametrami), żeby otrzymać dany wiersz pliku w jakiejś zmiennej, a potem ją przeszukać poleceniem _ findstr _ (http://ss64.com/nt/findstr.html). I jeśli bym znalazł szukaną wartość, starałbym się jakoś wyłuskać odpowiadajacą jej wartość i potem użyć.
Czy w cmd/bat “znaki enter” maja znaczenie? Z tego co widzę to, gdy napiszę “do (set F=%%G echo !F!)” to skrypt już nie działa. Dziwne, bo w dokumentacji konstrukcja FOR jest podawana w jednej linii:
Wszystko jest udokumentowane w /help poszczególnych poleceń (if, for, set,…). Nie jest to wygodne, ale jest pod ręką.
Generalnie trzeba sobie zdawać sprawę z tego, że wszystkie zmienne %foo% mają wartości ustawione w momencie uruchomienia skryptu. Jeśli skrypt ma reagować dynamicznie na jakieś dane, musisz użyć enabledelayedexpansion tak jak pisał pablo i wyłuskiwać zmienne zmienne przy użyciu wykrzykników a nie procentów.
Entery mają znaczenie czasem. Głównym źródłem problemów może być for, więc staraj się po do otwierać scope nawiasem. Powinieneś być dzięki temu bezpieczny. W przykładzie, który podałeś, starasz się mieć kilka wyrażeń w jednej linii. skąd echo ma wiedzieć, że “echo blah set foo=” to dwa polecenia anie nie próba wyświetlenia “blah set foo=”? Nie masz średników jak w C, więc umieszczaj jedno polecenie w jednej linii.
W dokumentacji NIE masz sytuacji, w której za do masz blok i w jednej linii kilka wyrażeń. Nie masz, bo to nie ma prawa działać.