CMD/.BAT - jak zmienić tekst w zmienną?

Witam,

 

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?

A co oznaczają te wykrzykniki?

To też jest odczyt zawartości danej zmiennej:

echo %S%
echo !S!

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!
)

Teraz otrzymasz poprawne dane.

A gdzie to znalazłeś? Zazwczyaj korzystam z pomocy storny SS64. Jest jakiś dobry tutorial opisujący wszystkei parametry poleceń?

 

Inna kwestia to jak znaleźć jakiś ciąg znaków w pliku tekstowym i bazować tylko na tym ciągu znaków?

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

Załózmy, że mam w pliku tekstowym ciągi znaków.

 

abcd efghijk

fghijak

xyz abcd

 

a chcę wyłuskać tylko te ciagi a których jest abcd

Nie wiem, co chcesz uzyskać, ale powyższe da Ci taki skrypt

for /F "tokens=* delims= skip=2" %%G in ('find "abcd" dane.txt') do echo %%G

gdzie w pliku dane.txt masz wiersze z danymi.

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:

 

http://ss64.com/nt/for_f.html

Wszystko jest udokumentowane w /help poszczególnych poleceń (if, for, set,…). Nie jest to wygodne, ale jest pod ręką. :wink:

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 :wink: 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ć. :wink: