2009-09-15 6 views
5

correlati:
How to list the elements of the path in a batch file?
How does FOR work?Come scriveresti un file .bat o .cmd per rimuovere un elemento dal PERCORSO?

Come vi scrivere un file batch o un file CMD per rimuovere un elemento dal percorso? Si deve gestire con garbo:

  • differenze nel caso
  • shortnames e nomi lunghi

Ho fatto questo utilizzando tr.exe ma è lento e complicato e utilizza i file temporanei, il che rende ancora più complicato.

io penso la risposta è qualcosa di simile:

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

... dove% elementToRemove% è l'elemento percorso da rimuovere. KeepIfUnique dovrebbe essere una subroutine che accetta due argomenti - i nomi di directory, li normalizza e aggiunge il primo argomento a tpath se è non uguale a al secondo argomento (elementToRemove).

Come ho detto, posso farlo con tr.exe, ma posso farlo solo con i comandi incorporati nella shell di windows cmd.exe?

EDIT: Credo che quando ci si arriva fino in fondo, la domanda è, come fare la conversione del caso in cmd.exe?

+0

Windows 7 include PowerShell 2, che si spera renderà la tua vita molto più semplice ... – TrueWill

risposta

4

Questo è quello che mi è venuta, con accenno di 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

Ottima soluzione. Questo parametro deve essere quotato? E questo rimuove TUTTE le voci dal percorso, o solo il primo? –

1

if comando ha ignora opzione caso

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

Vedi if /? per ulteriori informazioni sull'utilizzo di esso. Io in genere trovato questi comandi utile per determinare come fare qualche linea inganno cmd:

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

Mentre capisco che non vuoi dare risposte alle persone, questa domanda non è del tutto semplice e ha molte parti mobili.È un problema comune che deve essere risolto. –

0

Voglio aggiungere qualcosa alla risposta di Cheeso ... ma non ho abbastanza rep per aggiungere un commento.

Se si desidera che lo script ha fornito a lavorare anche dopo il file batch è terminata, quindi modificare l'ultima riga in questo modo questo:

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

Questo impiega un trucco: la 'tpath 'la variabile è disponibile quando la riga viene letta e analizzata da cmd.exe e espansa prima di essere eliminata da "endlocal".

Ciò consente di mantenere le modifiche della variabile "PATH" anche dopo l'uscita del file batch.