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?
windows
batch-file
working-directory
Hamed Kamrava
fuente
fuente
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
(pscripts\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 ejemploW:\scripts\
) y%~f0
devolverá el nombre de ruta completo (por ejemploW:\scripts\mybatch.cmd
).Puede hacer referencia a otros archivos en la misma carpeta que el script por lotes utilizando esta sintaxis:
Esto incluso se puede usar en una subrutina,
Echo %0
le dará la etiqueta de la llamada peroecho "%~nx0"
le dará el nombre del archivo del script por lotes.Cuando el
%0
variable se expande, el resultado se encierra entre comillas.Más sobre los parámetros del lote .
fuente
stm.sql
adentroD:\Dir1\Dir2\stm.sql
. Necesitomysql.exe -u root -p mysql < %cd%\stm.sql
ejecutar esos comandos stm.sql.*.bat
o*.sh
?D:\Dir1\Dir2\batchfile.bat
yD:\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:
fuente
cd /d %~dp0
como primera línea de archivo por lotes y trabajéDentro de su archivo .bat:
Ahora puede usar la variable
%mypath%
para hacer referencia a la ruta del.bat
archivo al archivo. Para verificar que la ruta es correcta:Por ejemplo, un archivo llamado
DIR.bat
con los siguientes contenidosejecutar desde el directorio
g:\test\bat
hará eco de esa ruta en la ventana de comandos de DOS.fuente
Esto es lo que uso en la parte superior de todos mis archivos por lotes. Acabo de copiar / pegar desde mi carpeta de plantillas.
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.
Por supuesto, Powershell hace esto y mucho más.
fuente
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
.