run how generate example create commands code batch bat windows batch-file

generate - how to create a batch file windows 10



¿Cómo verificar si existe el directorio en% PATH%? (21)

¿Cómo se puede verificar si un directorio ya está presente en la variable de entorno PATH? Aquí hay un comienzo. Todo lo que he logrado hacer con el siguiente código, sin embargo, es echo el primer directorio en% PATH%. Como se trata de un ciclo FOR, creería que enumeraría todos los directorios en% PATH%, pero solo obtiene el primero.

¿Hay una mejor manera de hacer esto? ¿Algo como find o findstr operando en la variable% PATH%? Me gustaría comprobar si existe un directorio en la lista de directorios en% PATH%, para evitar agregar algo que pueda estar allí.

FOR /F "delims=;" %%P IN ("%PATH%") DO ( @ECHO %%~P )


Agregar directorio a PATH si aún no existe:

set myPath=c:/mypath For /F "Delims=" %%I In (''echo %PATH% ^| find /C /I "%myPath%"'') Do set pathExists=%%I 2>Nul If %pathExists%==0 (set PATH=%myPath%;%PATH%)


Basándose en la respuesta de rcar, debe asegurarse de que no se encuentre una subcadena del objetivo.

if a%X%==a%PATH% echo %X% is in PATH echo %PATH% | find /c /i ";%X%" if errorlevel 1 echo %X% is in PATH echo %PATH% | find /c /i "%X%;" if errorlevel 1 echo %X% is in PATH


Después de leer las respuestas aquí, creo que puedo proporcionar un nuevo punto de vista: si el propósito de esta pregunta es saber si existe la ruta a un cierto archivo ejecutable en %PATH% y si no, insértelo (y este es el único razón para hacer eso, creo), entonces puede resolverse de una manera ligeramente diferente: "¿Cómo verificar si el directorio de un cierto programa ejecutable existe en% PATH%"? Esta pregunta se puede resolver fácilmente de esta manera:

for %%p in (programname.exe) do set "progpath=%%~$PATH:p" if not defined progpath ( rem The path to programname.exe don''t exist in PATH variable, insert it: set "PATH=%PATH%;C:/path/to/progranname" )

Si no conoce la extensión del archivo ejecutable, simplemente revise todos ellos:

set "progpath=" for %%e in (%PATHEXT%) do ( if not defined progpath ( for %%p in (programname.%%e) do set "progpath=%%~$PATH:p" ) )


En general, esto es para poner un exe / dll en la ruta. Mientras este archivo no aparezca en ningún otro lado:

@echo off where /q <put filename here> if %errorlevel% == 1 ( setx PATH "%PATH%;<additional path stuff>" ) else ( echo "already set path" )


Esta es una variación de la respuesta de Kevin Edwards usando reemplazo de cuerda. El patrón básico es:

IF "%PATH:new_path=%" == "%PATH%" PATH=%PATH%;new_path

Por ejemplo:

IF "%PATH:C:/Scripts=%" == "%PATH%" PATH=%PATH%;C:/Scripts

En pocas palabras, realizamos una prueba condicional donde intentamos eliminar / reemplazar new_path de nuestra PATH entorno PATH . Si new_path no existe, la condición tiene éxito y new_path se anexará a PATH por primera vez. Si new_path ya existe, la condición falla y no agregaremos new_path por segunda vez.


Esta rutina buscará una ruta / o archivo.ext en la variable de ruta de acceso devuelve 0 si se encuentra. Path / or file puede contener espacios si se cita. Si se pasa una variable como último argumento, se establecerá en d:/path/file .

@echo off&goto :PathCheck :PathCheck.CMD echo.PathCheck.CMD: Checks for existence of a path or file in %%PATH%% variable echo.Usage: PathCheck.CMD [Checkpath] or [Checkfile] [PathVar] echo.Checkpath must have a trailing / but checkfile must not echo.If Checkpath contains spaces use quotes ie. "C:/Check path/" echo.Checkfile must not include a path, just the filename.ext echo.If Checkfile contains spaces use quotes ie. "Check File.ext" echo.Returns 0 if found, 1 if not or -1 if checkpath does not exist at all echo.If PathVar is not in command line it will be echoed with surrounding quotes echo.If PathVar is passed it will be set to d:/path/checkfile with no trailing / echo.Then %%PathVar%% will be set to the fully qualified path to Checkfile echo.Note: %%PathVar%% variable set will not be surrounded with quotes echo.To view the path listing line by line use: PathCheck.CMD /L exit/b 1 :PathCheck if "%~1"=="" goto :PathCheck.CMD setlocal EnableDelayedExpansion set "PathVar=%~2" set "pth=" set "pcheck=%~1" if "%pcheck:~-1%" equ "/" ( if not exist %pcheck% endlocal&exit/b -1 set/a pth=1 ) for %%G in ("%path:;=" "%") do ( set "Pathfd=%%~G/" set "Pathfd=!Pathfd://=/!" if /i "%pcheck%" equ "/L" echo.!Pathfd! if defined pth ( if /i "%pcheck%" equ "!Pathfd!" endlocal&exit/b 0 ) else ( if exist "!Pathfd!%pcheck%" goto :CheckfileFound ) ) endlocal&exit/b 1 :CheckfileFound endlocal&( if not "%PathVar%"=="" ( call set "%~2=%Pathfd%%pcheck%" ) else (echo."%Pathfd%%pcheck%") exit/b 0 )


Esta versión funciona bastante bien. Simplemente verifica si vim71 está en la ruta y lo precede si no lo está.

@echo off echo %PATH% | find /c /i "vim71" > nul if not errorlevel 1 goto jump PATH = C:/Program Files/Vim/vim71/;%PATH% :jump

Esta demostración es para ilustrar la lógica errorlevel:

@echo on echo %PATH% | find /c /i "Windows" if "%errorlevel%"=="0" echo Found Windows echo %PATH% | find /c /i "Nonesuch" if "%errorlevel%"=="0" echo Found Nonesuch

La lógica se invierte en el código vim71 ya que errorlevel 1 es equivalente a errorlevel> = 1. Se deduce que errorlevel 0 siempre evaluará true, por not errorlevel 1 se utiliza " not errorlevel 1 ".

La verificación Postscript puede no ser necesaria si usa setlocal y endlocal para localizar la configuración de su entorno, por ej.

@echo off setlocal PATH = C:/Program Files/Vim/vim71/;%PATH% rem your code here endlocal

Después de endlocal estás de vuelta con tu ruta original.


Esto buscará una coincidencia exacta pero insensible a las mayúsculas y minúsculas, así que ten en cuenta cualquier barra invertida trasera, etc .:

for %P in ("%path:;=";"%") do @if /i %P=="PATH_TO_CHECK" echo %P exists in PATH

o, en un archivo por lotes (por ejemplo, checkpath.bat) que toma un argumento:

@for %%P in ("%path:;=";"%") do @if /i %%P=="%~1" echo %%P exists in PATH

En la última forma, se podría llamar, por ejemplo, la checkpath "%ProgramFiles%" para ver si la ruta especificada ya existe en PATH.

Tenga en cuenta que esta implementación asume que no hay punto y coma ni comillas presentes dentro de un solo elemento de ruta.


He combinado algunas de las respuestas anteriores para llegar a esto y asegurarme de que exista una entrada de ruta determinada tal como se da con la mayor brevedad posible y sin ecos de basura en la línea de comandos.

set myPath=<pathToEnsure | %1> echo ;%PATH%; | find /C /I ";%myPath%;" >nul if %ERRORLEVEL% NEQ 0 set PATH=%PATH%;%myPath%


Menciona que desea evitar agregar el directorio a la ruta de búsqueda si ya existe allí. ¿Tu intención es almacenar el directorio permanentemente en la ruta, o solo temporalmente para el archivo por lotes?

Si desea agregar (o eliminar) directorios de forma permanente a PATH, eche un vistazo a la utilidad Path Manager (pathman.exe) en Herramientas del Kit de recursos de Windows para tareas administrativas, http://support.microsoft.com/kb/927229 . Con eso, puede agregar o eliminar componentes de las rutas del sistema y del usuario, y manejará las anomalías, como las entradas duplicadas.

Si necesita modificar la ruta solo temporalmente para un archivo de proceso por lotes, simplemente agregaría la ruta adicional en frente de la ruta, con el riesgo de un ligero golpe de rendimiento debido a la entrada duplicada en la ruta.


No he hecho ninguna programación de archivos por lotes en un tiempo, pero:

echo ;%PATH%; | find /C /I ";<string>;"

debería darle 0 si no se encuentra cadena y 1 o más si es así.

EDITAR: Marcador de mayúsculas y minúsculas añadido, gracias a Panos.


Otra forma de comprobar si algo está en la ruta es ejecutar algún ejecutable inocente que no vaya a fallar si está allí y verificar el resultado. Como ejemplo, el siguiente fragmento de código comprueba si maven está en la ruta:

mvn --help > NUL 2> NUL if errorlevel 1 goto mvnNotInPath

Así que intento ejecutar mvn --help , ignorar el resultado (en realidad no quiero ver la ayuda si maven está allí) (> NUL), y tampoco mostrar el mensaje de error si no se encontró maven (2> NUL).


Para elaborar la respuesta de Heyvoon (2015.06.08) con Powershell, este sencillo script de Powershell debería darle detalles sobre% path%

$env:Path -split ";" | % {"$(test-path $_);$_"}

generando este tipo de salida que puede verificar independientemente

True;C:/WINDOWS True;C:/WINDOWS/system32 True;C:/WINDOWS/System32/Wbem False;C:windows/System32/windowsPowerShell/v1.0/ False;C:/Program Files (x86)/Java/jre7/bin

volver a montar para actualizar la ruta:

$x=$null;foreach ($t in ($env:Path -split ";") ) {if (test-path $t) {$x+=$t+";"}};$x


Primero señalaré una serie de cuestiones que hacen que este problema sea difícil de resolver a la perfección. Luego presentaré la solución más resistente a las balas que he podido encontrar.

Para esta discusión usaré una ruta en minúscula para representar una sola ruta de carpeta en el sistema de archivos, y una ruta en mayúsculas para representar la variable de entorno PATH.

Desde un punto de vista práctico, la mayoría de la gente quiere saber si PATH contiene el equivalente lógico de una ruta dada, no si PATH contiene una coincidencia de cadena exacta de una ruta determinada. Esto puede ser problemático porque:

  1. El final / es opcional en una ruta
    La mayoría de los caminos funcionan igual de bien con y sin el final. La ruta lógicamente apunta a la misma ubicación de cualquier manera. El PATH con frecuencia tiene una mezcla de caminos con y sin el final / . Este es probablemente el problema práctico más común al buscar una RUTA para un partido.

    • Hay una excepción: la ruta relativa C: (es decir, el directorio de trabajo actual de la unidad C) es muy diferente de C:/ (es decir, el directorio raíz de la unidad C)

  2. Algunos caminos tienen nombres cortos alternativos
    Cualquier ruta que no cumpla con el antiguo estándar 8.3 tiene una forma alternativa alternativa que cumple con el estándar. Este es otro tema de PATH que he visto con cierta frecuencia, especialmente en entornos comerciales.

  3. Windows acepta ambos / y / como separadores de carpeta dentro de una ruta.
    Esto no se ve muy a menudo, pero se puede especificar una ruta usando / lugar de / y funcionará bien dentro de PATH (y en muchos otros contextos de Windows)

  4. Windows trata separadores de carpetas consecutivos como un separador lógico.
    C: / FOLDER // y C: / FOLDER / son equivalentes. En realidad, esto ayuda en muchos contextos cuando se trata de una ruta de acceso porque un desarrollador generalmente puede anexar / a una ruta sin molestarse en verificar si la ruta / ya existe. Pero esto obviamente puede causar problemas si intenta realizar una coincidencia de cadena exacta.

    • Excepciones: no solo C: diferente de C:/ , sino C:/ (una ruta válida), es diferente de C:// (una ruta no válida).

  5. Windows recorta los puntos y espacios del final de los nombres de archivos y directorios.
    "C:/test. " Es equivalente a "C:/test" .

  6. Los actuales especificadores de carpeta ./ Y parent ../ pueden aparecer dentro de una ruta
    Es poco probable que se vea en la vida real, pero algo como C:/./parent/child/.././child/ es equivalente a C:/parent/child

  7. Una ruta puede incluirse opcionalmente entre comillas dobles.
    Una ruta a menudo se incluye entre comillas para proteger contra caracteres especiales como <space> ; ^ & = . En realidad, puede aparecer cualquier cantidad de comillas antes, dentro y / o después de la ruta. Son ignorados por Windows excepto para proteger contra caracteres especiales. Las comillas nunca se requieren dentro de PATH a menos que una ruta contenga a ; , pero las citas pueden estar presentes a pesar de todo.

  8. Un camino puede ser totalmente calificado o relativo.
    Una ruta totalmente calificada indica exactamente una ubicación específica dentro del sistema de archivos. Una ubicación de ruta relativa cambia según el valor de los volúmenes y directorios de trabajo actuales. Hay tres sabores principales de caminos relativos:

    • D: es relativo al directorio de trabajo actual del volumen D:
    • /myPath es relativo al volumen de trabajo actual (podría ser C :, D: etc.)
    • myPath es relativo al volumen de trabajo actual y al directorio

    Es perfectamente legal incluir una ruta relativa dentro de PATH. Esto es muy común en el mundo de Unix porque Unix no busca el directorio actual de manera predeterminada, por lo que una RUTA de Unix a menudo contendrá ./ . Pero Windows busca el directorio actual de manera predeterminada, por lo que las rutas relativas son raras en una RUTA de Windows.

Entonces, para verificar de manera confiable si PATH ya contiene una ruta, necesitamos una forma de convertir una ruta determinada en una forma canónica (estándar). El modificador de ~s utilizado por FOR variable y la expansión de argumentos es un método simple que resuelve los problemas del 1 al 6 y aborda parcialmente el problema 7. El modificador de ~s elimina las comillas encerradas, pero conserva las comillas internas. El problema 7 puede resolverse completamente eliminando explícitamente las citas de todas las rutas antes de la comparación. Tenga en cuenta que si una ruta no existe físicamente, el modificador ~s no agregará la / a la ruta, ni la convertirá en un formato válido de 8.3.

El problema con ~s es que convierte rutas relativas en rutas totalmente calificadas. Esto es problemático para el Issue 8 porque una ruta relativa nunca debe coincidir con una ruta totalmente calificada. Podemos usar expresiones regulares de FINDSTR para clasificar una ruta como totalmente calificada o relativa. Una ruta normal completa debe comenzar con <letter>:<separator> pero no <letter>:<separator><separator> , donde <separator> es / o / . Las rutas UNC siempre están totalmente calificadas y deben comenzar con // . Al comparar rutas totalmente calificadas, usamos el modificador ~s . Al comparar rutas relativas usamos las cadenas sin formato. Finalmente, nunca comparamos una ruta totalmente calificada con una ruta relativa. Esta estrategia proporciona una buena solución práctica para el Issue 8. La única limitación es que dos rutas relativas lógicamente equivalentes podrían tratarse como no coincidentes, pero esto es una preocupación menor porque las rutas relativas son raras en un Windows PATH.

Hay algunos problemas adicionales que complican este problema:

9) La expansión normal no es confiable cuando se trata de una RUTA que contiene caracteres especiales.
Los caracteres especiales no necesitan ser citados dentro de PATH, pero podrían serlo. Entonces una RUTA como C:/THIS & THAT;"C:/& THE OTHER THING" es perfectamente válida, pero no se puede expandir de forma segura usando expansión simple porque tanto "%PATH%" como %PATH% fallarán.

10) El delimitador de ruta también es válido dentro de un nombre de ruta
A ; se usa para delimitar rutas dentro de PATH, pero ; también puede ser un carácter válido dentro de una ruta, en cuyo caso la ruta debe ser citada. Esto causa un problema de análisis.

jeb resolvió los problemas 9 y 10 en la ventana ''Pretty print'' windows% PATH% - cómo dividir en '';'' en CMD shell

Así que podemos combinar el modificador de ~s y las técnicas de clasificación de ruta junto con mi variación del analizador de PATH de jeb para obtener esta solución casi a prueba de balas para comprobar si ya existe una ruta de acceso dada dentro de PATH. La función se puede incluir y llamar desde un archivo por lotes, o puede ser independiente y llamarse como su propio archivo de proceso por lotes inPath.bat. Parece mucho código, pero más de la mitad son comentarios.

@echo off :inPath pathVar :: :: Tests if the path stored within variable pathVar exists within PATH. :: :: The result is returned as the ERRORLEVEL: :: 0 if the pathVar path is found in PATH. :: 1 if the pathVar path is not found in PATH. :: 2 if pathVar is missing or undefined or if PATH is undefined. :: :: If the pathVar path is fully qualified, then it is logically compared :: to each fully qualified path within PATH. The path strings don''t have :: to match exactly, they just need to be logically equivalent. :: :: If the pathVar path is relative, then it is strictly compared to each :: relative path within PATH. Case differences and double quotes are :: ignored, but otherwise the path strings must match exactly. :: ::------------------------------------------------------------------------ :: :: Error checking if "%~1"=="" exit /b 2 if not defined %~1 exit /b 2 if not defined path exit /b 2 :: :: Prepare to safely parse PATH into individual paths setlocal DisableDelayedExpansion set "var=%path:"=""%" set "var=%var:^=^^%" set "var=%var:&=^&%" set "var=%var:|=^|%" set "var=%var:<=^<%" set "var=%var:>=^>%" set "var=%var:;=^;^;%" set var=%var:""="% set "var=%var:"=""Q%" set "var=%var:;;="S"S%" set "var=%var:^;^;=;%" set "var=%var:""="%" setlocal EnableDelayedExpansion set "var=!var:"Q=!" set "var=!var:"S"S=";"!" :: :: Remove quotes from pathVar and abort if it becomes empty set "new=!%~1:"=!" if not defined new exit /b 2 :: :: Determine if pathVar is fully qualified echo("!new!"|findstr /i /r /c:^"^^/"[a-zA-Z]:[///][^///]" ^ /c:^"^^/"[//][//]" >nul ^ && set "abs=1" || set "abs=0" :: :: For each path in PATH, check if path is fully qualified and then do :: proper comparison with pathVar. :: Exit with ERRORLEVEL 0 if a match is found. :: Delayed expansion must be disabled when expanding FOR variables :: just in case the value contains ! for %%A in ("!new!/") do for %%B in ("!var!") do ( if "!!"=="" endlocal for %%C in ("%%~B/") do ( echo(%%B|findstr /i /r /c:^"^^/"[a-zA-Z]:[///][^///]" ^ /c:^"^^/"[//][//]" >nul ^ && (if %abs%==1 if /i "%%~sA"=="%%~sC" exit /b 0) ^ || (if %abs%==0 if /i "%%~A"=="%%~C" exit /b 0) ) ) :: No match was found so exit with ERRORLEVEL 1 exit /b 1

La función se puede usar así (suponiendo que el archivo por lotes se llame inPath.bat):

set test=c:/mypath call inPath test && (echo found) || (echo not found)


Normalmente, la razón para verificar si existe una ruta dentro de PATH es porque desea agregar la ruta si no está allí. Esto normalmente se hace simplemente usando algo como path %path%;%newPath% . Pero el Issue 9 demuestra cómo esto no es confiable.

Otro problema es cómo devolver el valor PATH final a través de la barrera ENDLOCAL al final de la función, especialmente si la función se puede llamar con la expansión retrasada habilitada o deshabilitada. ¡Cualquier desacato ! corromperá el valor si la expansión retrasada está habilitada.

Estos problemas se resuelven usando una increíble técnica segura de devolución que el inventó aquí: http://www.dostips.com/forum/viewtopic.php?p=6930#p6930

@echo off :addPath pathVar /B :: :: Safely appends the path contained within variable pathVar to the end :: of PATH if and only if the path does not already exist within PATH. :: :: If the case insensitive /B option is specified, then the path is :: inserted into the front (Beginning) of PATH instead. :: :: If the pathVar path is fully qualified, then it is logically compared :: to each fully qualified path within PATH. The path strings are :: considered a match if they are logically equivalent. :: :: If the pathVar path is relative, then it is strictly compared to each :: relative path within PATH. Case differences and double quotes are :: ignored, but otherwise the path strings must match exactly. :: :: Before appending the pathVar path, all double quotes are stripped, and :: then the path is enclosed in double quotes if and only if the path :: contains at least one semicolon. :: :: addPath aborts with ERRORLEVEL 2 if pathVar is missing or undefined :: or if PATH is undefined. :: ::------------------------------------------------------------------------ :: :: Error checking if "%~1"=="" exit /b 2 if not defined %~1 exit /b 2 if not defined path exit /b 2 :: :: Determine if function was called while delayed expansion was enabled setlocal set "NotDelayed=!" :: :: Prepare to safely parse PATH into individual paths setlocal DisableDelayedExpansion set "var=%path:"=""%" set "var=%var:^=^^%" set "var=%var:&=^&%" set "var=%var:|=^|%" set "var=%var:<=^<%" set "var=%var:>=^>%" set "var=%var:;=^;^;%" set var=%var:""="% set "var=%var:"=""Q%" set "var=%var:;;="S"S%" set "var=%var:^;^;=;%" set "var=%var:""="%" setlocal EnableDelayedExpansion set "var=!var:"Q=!" set "var=!var:"S"S=";"!" :: :: Remove quotes from pathVar and abort if it becomes empty set "new=!%~1:"^=!" if not defined new exit /b 2 :: :: Determine if pathVar is fully qualified echo("!new!"|findstr /i /r /c:^"^^/"[a-zA-Z]:[///][^///]" ^ /c:^"^^/"[//][//]" >nul ^ && set "abs=1" || set "abs=0" :: :: For each path in PATH, check if path is fully qualified and then :: do proper comparison with pathVar. Exit if a match is found. :: Delayed expansion must be disabled when expanding FOR variables :: just in case the value contains ! for %%A in ("!new!/") do for %%B in ("!var!") do ( if "!!"=="" setlocal disableDelayedExpansion for %%C in ("%%~B/") do ( echo(%%B|findstr /i /r /c:^"^^/"[a-zA-Z]:[///][^///]" ^ /c:^"^^/"[//][//]" >nul ^ && (if %abs%==1 if /i "%%~sA"=="%%~sC" exit /b 0) ^ || (if %abs%==0 if /i %%A==%%C exit /b 0) ) ) :: :: Build the modified PATH, enclosing the added path in quotes :: only if it contains ; setlocal enableDelayedExpansion if "!new:;=!" neq "!new!" set new="!new!" if /i "%~2"=="/B" (set "rtn=!new!;!path!") else set "rtn=!path!;!new!" :: :: rtn now contains the modified PATH. We need to safely pass the :: value accross the ENDLOCAL barrier :: :: Make rtn safe for assignment using normal expansion by replacing :: % and " with not yet defined FOR variables set "rtn=!rtn:%%=%%A!" set "rtn=!rtn:"=%%B!" :: :: Escape ^ and ! if function was called while delayed expansion was enabled. :: The trailing ! in the second assignment is critical and must not be removed. if not defined NotDelayed set "rtn=!rtn:^=^^^^!" if not defined NotDelayed set "rtn=%rtn:!=^^^!%" ! :: :: Pass the rtn value accross the ENDLOCAL barrier using FOR variables to :: restore the % and " characters. Again the trailing ! is critical. for /f "usebackq tokens=1,2" %%A in (''%%^ ^"'') do ( endlocal & endlocal & endlocal & endlocal & endlocal set "path=%rtn%" ! ) exit /b 0


Puede lograr esto usando PoweShell;

Test-Path $ENV:SystemRoot/YourDirectory Test-Path C:/Windows/YourDirectory

Esto devuelve TRUE o FALSE

Corto, simple y fácil!


Si tu pregunta era "¿por qué este fragmento de script de cmd no funciona?" entonces la respuesta es que for /f itera sobre líneas. Los delims dividen líneas en campos, pero solo está capturando el primer campo en %%P No hay forma de capturar un número arbitrario de campos con un ciclo for /f .


Solo como una alternativa:

  1. En la carpeta en la que va a buscar la variable PATH , cree un archivo temporal con un nombre tan inusual que nunca esperaría tener ningún otro archivo en su computadora.

  2. Utilice la construcción de scripts por lotes estándar que le permite realizar la búsqueda de un archivo buscando en una lista de directorios definida por alguna variable de entorno (típicamente PATH ).

  3. Compruebe si el resultado de la búsqueda coincide con la ruta en cuestión y muestre el resultado.

  4. Eliminar el archivo temporal.

Esto podría verse así:

@ECHO OFF SET "mypath=D:/the/searched-for/path" SET unusualname=nowthisissupposedtobesomeveryunusualfilename ECHO.>"%mypath%/%unusualname%" FOR %%f IN (%unusualname%) DO SET "foundpath=%%~dp$PATH:f" ERASE "%mypath%/%unusualname%" IF "%mypath%" == "%foundpath%" ( ECHO The dir exists in PATH ) ELSE ( ECHO The dir DOES NOT exist in PATH )

Problemas conocidos:

  1. El método puede funcionar solo si el directorio existe (lo que no siempre es el caso).

  2. Crear / eliminar archivos en un directorio afecta su atributo ''fecha / hora modificada'' (que a veces puede ser un efecto no deseado).

  3. Crear un nombre de archivo globalmente único en la mente no se puede considerar muy confiable. Generar tal nombre no es en sí una tarea trivial.


También puede usar reemplazo de subcadena para probar la presencia de una subcadena. Aquí elimino las comillas para crear PATH_NQ, luego elimino "c: / mydir" de PATH_NQ y lo comparo con el original para ver si algo ha cambiado:

set PATH_NQ=%PATH:"=% if not "%PATH_NQ%"=="%PATH_NQ:c:/mydir=%" goto already_in_path set PATH=%PATH%;c:/mydir :already_in_path


Tomé su implementación usando el bucle for y lo extendí en algo que itera a través de todos los elementos de la ruta. Cada iteración del ciclo for elimina el primer elemento de la ruta (% p) de la ruta completa (mantenida en% q y% r).

@echo off SET MYPATHCOPY=%PATH% :search for /f "delims=; tokens=1,2*" %%p in ("%MYPATHCOPY%") do ( @echo %%~p SET MYPATHCOPY=%%~q;%%~r ) if "%MYPATHCOPY%"==";" goto done; goto search; :done

Muestra de salida:

Z:/>path.bat C:/Program Files/Microsoft DirectX SDK (November 2007)/Utilities/Bin/x86 c:/program files/imagemagick-6.3.4-q16 C:/WINDOWS/system32 C:/WINDOWS C:/SFU/common/ c:/Program Files/Debugging Tools for Windows C:/Program Files/Nmap


Un comentario al script "addPath"; Al suministrar un camino con espacios, vomita.

Ejemplo: call addPath "c: / Archivos de programa (x86) / Microsoft SDKs / Windows / v7.0A / Bin"

rendimiento: ''Archivos'' no se reconoce como un comando interno o externo, programa operable o archivo por lotes.


Usando for y for , no puedes capturar un número arbitrario de campos (como también señaló Adam ) por lo que debes usar una técnica de bucle. El siguiente script de comando listará cada ruta en la PATH entorno PATH en una línea separada:

@echo off setlocal if "%~1"=="" ( set PATHQ=%PATH% ) else ( set PATHQ=%~1 ) :WHILE if "%PATHQ%"=="" goto WEND for /F "delims=;" %%i in ("%PATHQ%") do echo %%i for /F "delims=; tokens=1,*" %%i in ("%PATHQ%") do set PATHQ=%%j goto WHILE :WEND

Simula un clásico mientras ... wend construct se encuentra en muchos lenguajes de programación. Con esto en su lugar, puede usar algo como findstr para luego filtrar y buscar una ruta en particular. Por ejemplo, si guardó la secuencia de comandos anterior en un archivo llamado tidypath.cmd , aquí se explica cómo puede canalizar a findstr , buscando rutas en el directorio de programas estándar (usando una coincidencia que no distingue entre mayúsculas y minúsculas):

> tidypath | findstr /i "%ProgramFiles%"