Primeiro, vi esse tópico, mas não consegui entender.
Pergunta:
Há um arquivo em lotes D:\path\to\file.batcom 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.batcom 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 %~f0retornando 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 %0fornecerá o rótulo de chamada, mas echo "%~nx0"fornecerá o nome do arquivo do script em lote.
Quando a %0variável é expandida, o resultado é colocado entre aspas.
stm.sqlno D:\Dir1\Dir2\stm.sql. Eu preciso mysql.exe -u root -p mysql < %cd%\stm.sqlexecutar os comandos stm.sql.
*.batou *.sh?
D:\Dir1\Dir2\batchfile.bate D:\Dir1\Dir2\stm.sql. O conteúdo do batchfile.bat é: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqle o conteúdo do stm.sql é alguns comandos do MySQL.
echo %~dp0retornará o caminho para o local do lote. echo %~f0retornará o caminho para o lote com o nome do arquivo.
Muito simples:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0como 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 .batarquivo. Para verificar se o caminho está correto:
@echo %mypath%
Por exemplo, um arquivo chamado DIR.batcom o seguinte conteúdo
set mypath=%cd%
@echo %mypath%
Pause
executar a partir do diretório g:\test\batecoará 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.