Во-первых, я видел эту тему, но я не мог этого понять.
Вопрос:
Существует пакетный файл D:\path\to\file.bat
со следующим содержимым:
echo %cd%
pause
Выход:
C:\
Это должно быть D:\path\to
Что я делаю не так?
Во-первых, я видел эту тему, но я не мог этого понять.
Вопрос:
Существует пакетный файл D:\path\to\file.bat
со следующим содержимым:
echo %cd%
pause
Выход:
C:\
Это должно быть D:\path\to
Что я делаю не так?
Ответы:
Системная переменная только для чтения %CD%
хранит путь к вызывающей стороне пакета, а не местоположение файла пакета.
Вы можете получить имя самого пакетного сценария, введенное пользователем %0
(например scripts\mybatch.bat
). К нему можно применить расширения параметров, поэтому %~dp0
вернет диск и путь к пакетному сценарию (например W:\scripts\
) и %~f0
вернет полный путь (например W:\scripts\mybatch.cmd
).
Вы можете ссылаться на другие файлы в той же папке, что и пакетный скрипт, используя этот синтаксис:
CALL %0\..\SecondBatch.cmd
Это может даже использоваться в подпрограмме, Echo %0
даст метку вызова, но echo "%~nx0"
даст вам имя файла пакетного сценария.
Когда %0
переменная раскрывается, результат заключается в кавычки.
stm.sql
в D:\Dir1\Dir2\stm.sql
. Мне нужно mysql.exe -u root -p mysql < %cd%\stm.sql
выполнить команды stm.sql.
*.bat
или *.sh
?
D:\Dir1\Dir2\batchfile.bat
и D:\Dir1\Dir2\stm.sql
. Содержимое batchfile.bat: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
и содержимое stm.sql - это некоторые команды MySQL.
echo %~dp0
вернет путь к местоположению партии. echo %~f0
вернет путь к пакету с именем файла.
Очень просто:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
качестве первой строки командный файл и работал
В вашем файле .bat:
set mypath=%cd%
Теперь вы можете использовать переменную %mypath%
для ссылки на путь к .bat
файлу. Чтобы проверить правильность пути:
@echo %mypath%
Например, файл вызывается DIR.bat
со следующим содержимым
set mypath=%cd%
@echo %mypath%
Pause
запустить из каталога g:\test\bat
будет отображать этот путь в окне команд DOS.
Вот что я использую в верхней части всех моих командных файлов. Я просто копирую / вставляю из моей папки с шаблонами.
@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
Установка пути к текущему пакетному файлу в% batdir% позволяет вам вызывать его в последующих командах stmts в текущем пакетном файле, независимо от того, где изменяется этот пакетный файл. Использование PUSHD позволяет вам использовать POPD, чтобы быстро установить путь этого пакетного файла к исходному% batdir%. Помните, что если вы используете% batdir% ExtraDir или% batdir% \ ExtraDir (в зависимости от версии, использованной выше, с обратной косой чертой или без нее), вам нужно заключить всю строку в двойные кавычки, если путь содержит пробелы (то есть «% batdir% ExtraDir» ). Вы всегда можете использовать PUSHD% ~ dp0. [https: // ss64.com/ nt / syntax-args .html] содержит больше параметров (% ~).
Обратите внимание, что использование (: :) в начале строки делает ее строкой комментария. Что еще более важно, использование :: позволяет вам включать редиректоры, каналы, специальные символы (т. Е. <> | И т. Д.) В этот комментарий.
:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt
Конечно, Powershell делает это и многое другое.
set batdir=%CD%
). Это не нормально, потому что это путь к вызывающей стороне, а не сам файл bat. Единственный действительный способ получить путь к исполняемому файлу bat - это %~dp0
.