2011-03-21 6 views
5

Las versiones de Windows x64 contienen carpetas nombradas con paréntesis como "\ Archivos de programa (x86)" y esto rompe un archivo por lotes que uso. Un ejemplo de una línea de problema:Windows x64 y el problema del archivo por lotes "paréntesis en la ruta"

para %% c en (% ruta%) hacer si existe "%% c \ xyz.exe" set xyz = OK

es decir, cuando alcanza ")" en " (x86) "se emite un mensaje de error y sale ...

¿Alguna idea sobre cómo solucionar esto? Este es un archivo por lotes bastante grande, y atm no tengo el tiempo para volver a escribir en un idioma mejor ...

Muchas gracias :)

+0

¿Estás seguro de que ha copiado la instrucción FOR' muy exacta '? –

+0

@PA sí, puedo reproducir el error. No puedo pensar en una solución rápida. –

+0

@PA Sí, solo cambié el nombre del archivo ejecutable a xyz ... – stereochilly

Respuesta

5

No responde su pregunta directamente, pero si intenta hacer lo que creo que está intentando (que es asegurarse de que exista un archivo en la ruta) puede usar algo como lo siguiente en un archivo por lotes.

@echo off 
    for %%i in (xyz.exe) do set xyz=%%~$PATH:i 

    if "%xyz%" == "" Goto NotFound 

    Echo "Found" 
    Goto TheEnd 

:NotFound 
    Echo "Not found" 

:TheEnd 
+0

Buena idea ... Voy a intentar esto también ... – stereochilly

+0

Funciona de maravilla ... :) Y puedo preguntar qué es todo %% ~ $: significa? Muy críptico ...;) – stereochilly

+0

@stereo que está todo documentado en el uso de for. Escriba para /? en la consola –

2

Puede utilizar los nombres cortos de la carpeta de este propósito. Así es como lo haces.

Abrir instrucción de comando en Windows. Ir a la unidad C (o la unidad en la que tiene la carpeta de programa) escriba lo siguiente y

c:\> dir /x <Hit Enter> 

Esto devolverá las formas cortas de todas las carpetas.

Notarás ahora que "\ Program Files (x86)" se representará como "PROGRA ~ 2" (o un nombre corto equivalente). Esto es lo que uso para evitar cualquier error al crear scripts por lotes.

Para ver más opciones, ver aquí. http://www.computerhope.com/dirhlp.htm

Exlpanation para "dir/x"
"Esto muestra los nombres cortos generados por los nombres de archivo no tiene el formato 8.3. El formato es el de/Si N con el nombre corto insertado antes del nombre largo. Sin nombre corto está presente, los espacios en blanco se muestran en su lugar ".

+0

La variable de entorno PATH de OP no use nombres cortos. –

+0

¿No sería tal un enfoque que le obligue a iterar a través de todas las carpetas en oposición a solo las que contiene la variable de entorno "Ruta"? – BrMcMullin

+0

Este es un enfoque manual, que infringe el propósito de "para declaración "y la de ejecutar archivos por lotes en general ... – stereochilly

3

Normalmente citando debería funcionar, pero en este caso se desee iterar sobre todos los elementos separados por ;.

Pero puede reemplazar el ; en una combinación de " ", por lo que los corchetes se citan y puede iterar sobre los elementos.

muestra: path=C:\temp;C:\windows;C:\Program Files (x86)
El ciclo for buscará en
"C:\temp" "C:\windows" "C:\Program Files (x86)"

Como código se ve como

setlocal EnableDelayedExpansion 
set "searchPath=!path:;=" "!" 
for %%c in ("!searchPath!") do (
    if exist "%%~c\xyz.exe" set xyz=OK 
) 
+0

Niza ... Gracias :) – stereochilly

Cuestiones relacionadas