Во-первых, я видел эту тему, но я не мог этого понять.
Вопрос:
Существует пакетный файл 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.