2009-09-15 8 views
5

relacionadas:
How to list the elements of the path in a batch file?
How does FOR work?¿Cómo escribirías un archivo .bat o .cmd para eliminar un elemento de la RUTA?

¿Cómo escribirías un archivo por lotes o un archivo CMD para eliminar un elemento de la ruta? Se debe manejar con gracia:

  • diferencias en caso
  • nombres cortos y largos nombres

He hecho esto usando tr.exe pero es lento y complicado y utiliza archivos temporales, lo que hace aún más complicado.

I piensan que la respuesta es algo como esto:

setlocal 
set tpath="" 
set _path="%PATH:;=" "%" 
for %%p in (%_path%) do (
    call :KeepIfNotEqual %%p %elementToRemove% 
) 
endlocal & set path=%tpath% 

... donde% elementToRemove% es el elemento de la ruta de eliminar. KeepIfUnique debería ser una subrutina que toma dos argumentos: nombres de directorio, los normaliza y agrega el primer argumento a tpath si es no igual a al segundo argumento (elementoToRemove).

Como dije, puedo hacer esto con tr.exe, pero ¿puedo hacerlo con solo los comandos incorporados en el shell de windows cmd.exe?

EDIT: Supongo que cuando llegue a eso, la pregunta es, ¿cómo hacer la conversión de casos en cmd.exe?

comando
+0

Windows 7 incluye PowerShell 2, que con suerte le hará la vida mucho más fácil ... – TrueWill

Respuesta

4

Esto es lo que me ocurrió, usando indirecta de Igor.

@echo off 
goto START 

------------------------------------------------------- 
rmpath.bat 

remove a path element from path 

Created Tue Sep 15 21:33:54 2009 

------------------------------------------------------- 

:START 
SETLOCAL ENABLEDELAYEDEXPANSION 

@REM require one argument (the path element to remove) 
if _%1==_ goto USAGE 

@REM ~fs = remove quotes, full path, short names 
set fqElement=%~fs1 

@REM convert path to a list of quote-delimited strings, separated by spaces 
set fpath="%PATH:;=" "%" 

@REM iterate through those path elements 
for %%p in (%fpath%) do (
    @REM ~fs = remove quotes, full path, short names 
    set p2=%%~fsp 
    @REM is this element NOT the one we want to remove? 
    if /i NOT "!p2!"=="%fqElement%" (
     if _!tpath!==_ (set tpath=%%~p) else (set tpath=!tpath!;%%~p) 
    ) 
) 

set path=!tpath! 

@call :LISTPATH 

goto ALL_DONE 
------------------------------------------------------- 

-------------------------------------------- 
:LISTPATH 
    echo. 
    set _path="%PATH:;=" "%" 
    for %%p in (%_path%) do if not "%%~p"=="" echo  %%~p 
    echo. 
    goto :EOF 
-------------------------------------------- 


-------------------------------------------- 
:USAGE 
    echo usage: rmpath ^<arg^> 
    echo  removes a path element from the path. 
    goto ALL_DONE 

-------------------------------------------- 

:ALL_DONE 
ENDLOCAL & set path=%tpath% 
+0

Gran solución. ¿Es necesario citar este parámetro? ¿Elimina esto TODAS las entradas de la ruta o solo la primera? –

1

if tiene la opción de ignorar caso

if /I "Blah"=="blah" (echo true) else (echo false) 

Ver if /? para obtener más ayuda sobre el uso de la misma. Yo por lo general encontrado estos comandos útiles en la determinación de cómo hacer algunas trampas línea de cmd:

if /? 
call /? 
for /? 
set /? 
+0

Aunque entiendo que no desea copiar las respuestas de las personas, esta pregunta no es del todo simple y tiene muchas partes móviles.Es un problema común que necesita ser resuelto. –

0

Quiero agregar algo a la respuesta de Cheeso ... pero no tengo suficientes representantes para agregar un comentario.

Si desea que el guión que proporcionan a trabajar incluso después el archivo por lotes se termina, a continuación, cambiar la última línea como esta esto:

@echo off 
    . . . 
    . . . 
SETLOCAL ENABLEDELAYEDEXPANSION 
    . . . 
    . . . 
endlocal & set path=%tpath% 

Este emplea un truco: la 'tpath 'variable está disponible cuando esa línea es read-in y analizada por cmd.exe y expandida antes de ser eliminada por' endlocal '.

Esto permite que los cambios en la variable 'PATH' continúen incluso después de que el archivo de proceso finalice.

Cuestiones relacionadas