2008-10-08 11 views
6

Tengo un archivo por lotes que utiliza este idioma (muchas veces) para leer un valor de registro en una variable de entorno:¿Por qué el archivo por lotes FOR falla al iterar sobre la salida del comando?

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

(Hay un carácter de tabulación después delims=)

Esto funciona bien en miles de las computadoras del cliente. Pero en la computadora de un cliente (que ejecuta Windows Server 2003, extensiones de comando habilitadas), falla con 'REG QUERY' HKLM \ SOFTWARE \ Path \ To \ Key "/ v ValueName 'no se reconoce como un comando interno o externo, programa operable o archivo por lotes.' Ejecutar el comando "reg query" solo funciona bien. Reg.exe está presente en C: \ Windows \ System32.

que fue capaz de evitar el problema cambiando el código para

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

Esto hizo que el hasta al cliente y correr, pero me gustaría entender por qué se produjo el problema para que pueda evitarlo en el futuro .

Un poco fuera del tema principal: una forma más directa de obtener un valor de registro (cadena o DWORD) en una variable de entorno también sería útil.

Respuesta

0

El conmutador /F necesita extensiones de comando para encenderse. Por lo general, están activados por defecto, pero yo verificaría eso. En los sistemas XP puede convertirlos en hacer algo así como

cmd /e:on 

o control del registro bajo

HKCU\Software\Microsoft\Command Processor\EnableExtensions 

No sé acerca de Windows Server.

Hacer help for y help cmd podría proporcionar algunas sugerencias también.

+0

Verifiqué que se haya habilitado EnableExtensions. Editaré la pregunta para tomar nota de eso. –

1

Comprobaría: papel

  1. del cliente en la máquina - que son un administrador?
  2. ¿Dónde está reg.exe en la caja? ¿Hay más de una copia de copia de reg.exe en la ruta?
  3. ¿Hay alguna diferencia de configuración regional en la máquina del cliente de las máquinas donde esto normalmente funciona?

Básicamente, enumere todo lo que difiera entre esta máquina y las máquinas donde funciona según lo esperado. Incluye paquetes de servicio, membresía de dominio, etc.

1

Guau, eso es extraño.

Si los mismos comandos funcionan cuando se dividen en dos líneas, entonces supongo que tiene algo que ver con la forma en que se ejecuta el comando en una subshell en el comando FOR.

Si realmente se muere por descubrir por qué está muriendo en este caso particular, puede ejecutar comandos como "SET> envvars.txt" como el comando FOR y compararlo con el shell superior.

O tal vez comience por simple e intente ejecutar el comando REG a través de CMD/C para ver si eso hace algo?

Una suposición rápida aquí, ¿cuáles son los valores de COMSPEC y SHELL?

1

Tuve una situación similar a esta. En mi caso, fue un mal valor en COMSPEC. Lo arreglé y el script comenzó a funcionar como se esperaba.

Cuestiones relacionadas