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:
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 deC:/
(es decir, el directorio raíz de la unidad C)
- Hay una excepción: la ruta relativa
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.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)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 deC:/
, sinoC:/
(una ruta válida), es diferente deC://
(una ruta no válida).
- Excepciones: no solo
Windows recorta los puntos y espacios del final de los nombres de archivos y directorios.
"C:/test. "
Es equivalente a"C:/test"
.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 comoC:/./parent/child/.././child/
es equivalente aC:/parent/child
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.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)
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:
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.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
).Compruebe si el resultado de la búsqueda coincide con la ruta en cuestión y muestre el resultado.
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:
El método puede funcionar solo si el directorio existe (lo que no siempre es el caso).
Crear / eliminar archivos en un directorio afecta su atributo ''fecha / hora modificada'' (que a veces puede ser un efecto no deseado).
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%"