2009-09-15 4 views
5

Verwandte:
How to list the elements of the path in a batch file?
How does FOR work?Wie würden Sie eine .bat oder .cmd Datei schreiben, um ein Element aus dem PATH zu entfernen?

Wie würden Sie eine Batchdatei oder CMD-Datei schreiben ein Element aus dem Weg zu entfernen? Es sollte anmutig Griff:

  • Unterschiede bei
  • Kurznamen und lange Namen

ich dies mit tr.exe getan haben, aber es ist langsam und kompliziert und verwendet temporäre Dateien, die es macht sogar komplizierter.

ich denken die Antwort so etwas wie dieses:

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

... where% elementToRemove% der Pfad Element zu entfernen. KeepIfUnique müsste eine Subroutine sein, die zwei Argumente benötigt - Verzeichnisnamen, normalisiert sie und hängt das erste Argument an tpath an, wenn es ungleich mit dem zweiten Argument (elementToRemove) ist.

Wie gesagt, ich kann dies mit tr.exe tun, aber kann ich es mit nur eingebauten Befehlen in der Windows cmd.exe Shell tun?

BEARBEITEN: Ich denke, wenn Sie gleich darauf kommen, ist die Frage, wie die Fall-Konvertierung in cmd.exe zu tun?

+0

Windows 7 enthält PowerShell 2, die hoffentlich Ihr Leben viel einfacher machen wird ... – TrueWill

Antwort

4

Dies ist, was ich mit aufkommen, mit Igor Hinweis.

@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

Große Lösung. Muss dieser Parameter zitiert werden? Und entfernt das ALLE Einträge aus dem Pfad oder nur die erste? –

1

if Befehl hat

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

Siehe if /? für mehr Hilfe, um es über die Verwendung. Ich fand im Allgemeinen dieser Befehle hilfreich bei der Bestimmung, wie einige cmd Linie Tricks zu tun:

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

Während ich verstehe, dass Sie nicht load Feed Menschen Antworten wollen, ist diese Frage nicht ganz einfach, und hat viele bewegliche Teile.Es ist ein häufiges Problem, das gelöst werden muss. –

0

Ich möchte etwas zu Cheesos Antwort hinzufügen ... aber ich habe nicht genug Rep, um einen Kommentar hinzuzufügen.

Wenn Sie das Skript wollen wenn er arbeiten auch nach die Batch-Datei beendet ist, dann die letzte Zeile wie diese sich dies ändern:

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

Dies setzt einen netten Trick: die ‚TPath 'Variable ist verfügbar, wenn diese Zeile von cmd.exe eingelesen und geparst wird und vor dem Löschen von' endlocal 'erweitert wird.

Dadurch können die Änderungen an der Variablen 'PATH' auch nach dem Beenden der Stapeldatei beibehalten werden.