En primer lugar, vi este tema pero no pude entenderlo.
Pregunta:
Hay un archivo por lotes D:\path\to\file.bat
con el siguiente contenido:
echo %cd%
pause
Salida es:
C:\
Debe ser D:\path\to
¿Qué estoy haciendo mal?
En primer lugar, vi este tema pero no pude entenderlo.
Pregunta:
Hay un archivo por lotes D:\path\to\file.bat
con el siguiente contenido:
echo %cd%
pause
Salida es:
C:\
Debe ser D:\path\to
¿Qué estoy haciendo mal?
Respuestas:
La variable de solo lectura del sistema %CD%
mantiene la ruta del llamante del lote, no la ubicación del archivo del lote.
Puede obtener el nombre de la secuencia de comandos por lotes, tal como la escribió el usuario con %0
(p scripts\mybatch.bat
. Ej .). Las extensiones de parámetros se pueden aplicar a esto, por %~dp0
lo que devolverá la unidad y la ruta al script por lotes (por ejemplo W:\scripts\
) y %~f0
devolverá el nombre de ruta completo (por ejemplo W:\scripts\mybatch.cmd
).
Puede hacer referencia a otros archivos en la misma carpeta que el script por lotes utilizando esta sintaxis:
CALL %0\..\SecondBatch.cmd
Esto incluso se puede usar en una subrutina, Echo %0
le dará la etiqueta de la llamada pero echo "%~nx0"
le dará el nombre del archivo del script por lotes.
Cuando el %0
variable se expande, el resultado se encierra entre comillas.
stm.sql
adentro D:\Dir1\Dir2\stm.sql
. Necesito mysql.exe -u root -p mysql < %cd%\stm.sql
ejecutar esos comandos stm.sql.
*.bat
o *.sh
?
D:\Dir1\Dir2\batchfile.bat
y D:\Dir1\Dir2\stm.sql
. el contenido de batchfile.bat es: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
y el contenido de stm.sql es algunos comandos de MySQL.
echo %~dp0
devolverá la ruta a la ubicación del lote. echo %~f0
devolverá la ruta al lote con el nombre del archivo.
Muy simple:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
como primera línea de archivo por lotes y trabajé
Dentro de su archivo .bat:
set mypath=%cd%
Ahora puede usar la variable %mypath%
para hacer referencia a la ruta del .bat
archivo al archivo. Para verificar que la ruta es correcta:
@echo %mypath%
Por ejemplo, un archivo llamado DIR.bat
con los siguientes contenidos
set mypath=%cd%
@echo %mypath%
Pause
ejecutar desde el directorio g:\test\bat
hará eco de esa ruta en la ventana de comandos de DOS.
Esto es lo que uso en la parte superior de todos mis archivos por lotes. Acabo de copiar / pegar desde mi carpeta de plantillas.
@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
Establecer la ruta del archivo por lotes actual en% batdir% le permite llamarlo en los siguientes pasos en el archivo por lotes actual, independientemente de dónde cambie este archivo por lotes. El uso de PUSHD le permite usar POPD para establecer rápidamente la ruta de este archivo por lotes al% batdir% original. Recuerde, si usa% batdir% ExtraDir o% batdir% \ ExtraDir (dependiendo de la versión utilizada anteriormente, finalizando la barra invertida o no) deberá encerrar la cadena completa entre comillas dobles si la ruta tiene espacios (es decir, "% batdir% ExtraDir" ) Siempre puede usar PUSHD% ~ dp0. [https: // ss64.com/ nt / syntax-args .html] tiene más información sobre (% ~) parámetros.
Tenga en cuenta que usar (: :) al comienzo de una línea la convierte en una línea de comentario. Más importante aún, el uso de :: le permite incluir redirectores, tuberías, caracteres especiales (es decir, <> | etc.) en ese comentario.
:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt
Por supuesto, Powershell hace esto y mucho más.
set batdir=%CD%
). No está bien, porque es la ruta a la persona que llama, no el archivo bat en sí. La única forma válida de obtener la ruta al archivo bat en ejecución es %~dp0
.