Primeiro, vi esse tópico, mas não consegui entender.
Pergunta:
Há um arquivo em lotes D:\path\to\file.bat
com o seguinte conteúdo:
echo %cd%
pause
A saída é:
C:\
Deve ser D:\path\to
O que estou fazendo de errado?
Primeiro, vi esse tópico, mas não consegui entender.
Pergunta:
Há um arquivo em lotes D:\path\to\file.bat
com o seguinte conteúdo:
echo %cd%
pause
A saída é:
C:\
Deve ser D:\path\to
O que estou fazendo de errado?
Respostas:
A variável somente leitura do sistema %CD%
mantém o caminho do chamador do lote, não o local do arquivo em lote.
Você pode obter o nome do script em lote, digitado pelo usuário com %0
(por exemplo scripts\mybatch.bat
). Extensões de parâmetros podem ser aplicadas a isso %~dp0
, retornando o Drive e o Caminho para o script em lote (por exemplo W:\scripts\
) e %~f0
retornando o nome do caminho completo (por exemplo W:\scripts\mybatch.cmd
).
Você pode consultar outros arquivos na mesma pasta que o script em lote usando esta sintaxe:
CALL %0\..\SecondBatch.cmd
Isso pode até ser usado em uma sub-rotina, Echo %0
fornecerá o rótulo de chamada, mas echo "%~nx0"
fornecerá o nome do arquivo do script em lote.
Quando a %0
variável é expandida, o resultado é colocado entre aspas.
stm.sql
no D:\Dir1\Dir2\stm.sql
. Eu preciso mysql.exe -u root -p mysql < %cd%\stm.sql
executar os comandos stm.sql.
*.bat
ou *.sh
?
D:\Dir1\Dir2\batchfile.bat
e D:\Dir1\Dir2\stm.sql
. O conteúdo do batchfile.bat é: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
e o conteúdo do stm.sql é alguns comandos do MySQL.
echo %~dp0
retornará o caminho para o local do lote. echo %~f0
retornará o caminho para o lote com o nome do arquivo.
Muito simples:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
como primeira linha de arquivo de lote e trabalhou
Dentro do seu arquivo .bat:
set mypath=%cd%
Agora você pode usar a variável %mypath%
para referenciar o caminho do .bat
arquivo. Para verificar se o caminho está correto:
@echo %mypath%
Por exemplo, um arquivo chamado DIR.bat
com o seguinte conteúdo
set mypath=%cd%
@echo %mypath%
Pause
executar a partir do diretório g:\test\bat
ecoará esse caminho na janela de comando do DOS.
Aqui está o que eu uso na parte superior de todos os meus arquivos em lotes. Acabei de copiar / colar da minha pasta de modelos.
@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
Definir o caminho do arquivo em lotes atual para% batdir% permite chamá-lo em stmts subseqüentes no arquivo em lotes atual, independentemente de onde esse arquivo em lote é alterado. O uso do PUSHD permite que você use o POPD para definir rapidamente o caminho desse arquivo em lote como% batdir% original. Lembre-se, se você estiver usando% batdir% ExtraDir ou% batdir% \ ExtraDir (dependendo da versão usada acima, terminando a barra invertida ou não), será necessário colocar a cadeia inteira entre aspas duplas se o caminho tiver espaços (por exemplo, "% batdir% ExtraDir" ) Você sempre pode usar PUSHD% ~ dp0. [https: // ss64.com/ nt / syntax-args .html] possui mais parâmetros (% ~).
Observe que usar (: :) no início de uma linha faz com que seja uma linha de comentário. Mais importante, usar :: permite incluir redirecionadores, canais, caracteres especiais (por exemplo, <> | etc) nesse comentário.
:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt
Claro, o Powershell faz isso e muito mais.
set batdir=%CD%
). Não está bom, porque é o caminho para o chamador, não o próprio arquivo bat. A única maneira válida de obter o caminho para o arquivo bat em execução é %~dp0
.