2008-10-08 9 views
6

Mam plik wsadowy, który używa tego idiomu (wiele razy), aby odczytać wartość rejestru w zmiennej środowiskowej:Dlaczego plik wsadowy FOR kończy się niepowodzeniem podczas iterowania po wynikach polecenia?

FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "HKLM\SOFTWARE\Path\To\Key" /v ValueName') DO SET MyVariable=%%B 

(tam jest znak tabulatora po delims=)

Działa to dobrze na tysiącach komputery klienta. Ale na komputerze jednego klienta (z uruchomionym Windows Server 2003, z włączonymi rozszerzeniami poleceń), nie działa z "REG QUERY" HKLM \ SOFTWARE \ Path \ To \ Key "/ v ValueName" nie jest rozpoznawane jako wewnętrzne lub zewnętrzne polecenie, działający program lub plik wsadowy. " Samo uruchomienie polecenia "zapytaj o reg" działa dobrze. Reg.exe jest obecny w C: \ Windows \ System32.

udało mi się obejść ten problem poprzez zmianę kodu do

REG QUERY "HKLM\SOFTWARE\Path\To\Key" /v ValueName > temp.txt 
FOR /F "tokens=2* delims= " %%A IN (temp.txt) DO SET MyVariable=%%B 

ten dostał się klient i działa, ale chciałbym zrozumieć, dlaczego wystąpił błąd, dzięki czemu można uniknąć go w przyszłości .

Nieco poza głównym tematem - bardziej przydatny byłby również bardziej bezpośredni sposób uzyskania wartości rejestru (ciąg lub DWORD) w zmiennej środowiskowej.

Odpowiedz

0

Przełącznik /F wymaga włączenia rozszerzeń poleceń. Zazwyczaj są one domyślnie włączone, ale sprawdziłbym to. W systemach XP można je włączyć coś jak

cmd /e:on 

lub sprawdzanie rejestru pod

HKCU\Software\Microsoft\Command Processor\EnableExtensions 

Nie wiem o Windows Server.

Wykonanie help for i help cmd może również dostarczyć pewnych wskazówek.

+0

Sprawdziłem, czy ustawiono EnableExtensions. Będę edytować pytanie, aby to zauważyć. –

1

chciałbym sprawdzić: rolę

  1. klienta na komputerze - czy są adminem?
  2. Gdzie jest reg.exe na pudełku - czy w ścieżce znajduje się więcej niż jedna kopia pliku reg.exe?
  3. Czy na komputerze klienta występują różnice lokalizacji, które zwykle działają?

Zasadniczo wylicza wszystko, co różni się między tym urządzeniem a maszynami, w których działa zgodnie z oczekiwaniami. Dołącz dodatki Service Pack, członkostwo w domenie itp.

1

Wow, to dziwne.

Jeśli te same polecenia działają po podzieleniu na dwie linie, to domyślam się, że ma to coś wspólnego ze sposobem uruchamiania polecenia w podpowłoce w poleceniu FOR.

Jeśli naprawdę chciałeś wymyślić, dlaczego umiera w tym konkretnym przypadku, możesz uruchomić polecenia "SET> envvars.txt" jako polecenie FOR i porównać je z górną powłoką.

A może rozpocząć proste i spróbuj uruchomić polecenie REG przez CMD/C, aby zobaczyć, czy to coś?

Jedno krótkie przypuszczenie, jakie są wartości COMSPEC i SHELL?

1

Miałem podobną sytuację. W moim przypadku była to zła wartość w COMSPEC. Naprawiłem to i skrypt zaczął działać zgodnie z oczekiwaniami.

Powiązane problemy