In primo luogo, ho visto questo argomento ma non riuscivo a capirlo.
Domanda:
Esiste un file batch D:\path\to\file.bat
con il seguente contenuto:
echo %cd%
pause
L'output è:
C:\
Dev'essere D:\path\to
Che cosa sto facendo di sbagliato?
In primo luogo, ho visto questo argomento ma non riuscivo a capirlo.
Domanda:
Esiste un file batch D:\path\to\file.bat
con il seguente contenuto:
echo %cd%
pause
L'output è:
C:\
Dev'essere D:\path\to
Che cosa sto facendo di sbagliato?
Risposte:
La variabile di sola lettura del sistema %CD%
mantiene il percorso del chiamante del batch, non la posizione del file batch.
È possibile ottenere il nome dello script batch stesso come digitato dall'utente con %0
(ad esempio scripts\mybatch.bat
). A questo si possono applicare estensioni di parametri in modo %~dp0
da restituire Drive e Path allo script batch (ad es. W:\scripts\
) E %~f0
restituire il percorso completo (ad es W:\scripts\mybatch.cmd
.).
È possibile fare riferimento ad altri file nella stessa cartella dello script batch utilizzando questa sintassi:
CALL %0\..\SecondBatch.cmd
Questo può anche essere usato in una subroutine, Echo %0
darà l'etichetta di chiamata ma, echo "%~nx0"
ti darà il nome del file dello script batch.
Quando la %0
variabile viene espansa, il risultato viene racchiuso tra virgolette.
stm.sql
in D:\Dir1\Dir2\stm.sql
. Devo mysql.exe -u root -p mysql < %cd%\stm.sql
eseguire i comandi stm.sql.
*.bat
o *.sh
?
D:\Dir1\Dir2\batchfile.bat
e D:\Dir1\Dir2\stm.sql
. Il contenuto batchfile.bat è: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
e il contenuto stm.sql è composto da alcuni comandi MySQL.
echo %~dp0
restituirà il percorso alla posizione batch. echo %~f0
restituirà il percorso al batch con nome file.
Molto semplice:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
come prima riga di file batch e
Nel tuo file .bat:
set mypath=%cd%
Ora puoi usare la variabile %mypath%
per fare riferimento al percorso del .bat
file al file. Per verificare che il percorso sia corretto:
@echo %mypath%
Ad esempio, un file chiamato DIR.bat
con i seguenti contenuti
set mypath=%cd%
@echo %mypath%
Pause
eseguito dalla directory g:\test\bat
farà eco a quel percorso nella finestra di comando DOS.
Ecco cosa uso nella parte superiore di tutti i miei file batch. Ho appena copiato / incollato dalla mia cartella dei modelli.
@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
L'impostazione del percorso del file batch corrente su% batdir% consente di chiamarlo negli stts successivi nel file batch corrente, indipendentemente da dove questo file batch viene modificato. L'uso di PUSHD consente di utilizzare POPD per impostare rapidamente il percorso di questo file batch su% batdir% originale. Ricorda, se si utilizza% batdir% ExtraDir o% batdir% \ ExtraDir (a seconda della versione utilizzata in precedenza, terminando la barra rovesciata o meno) sarà necessario racchiudere l'intera stringa tra virgolette doppie se il percorso ha spazi (ovvero "% batdir% ExtraDir" ). Puoi sempre usare PUSHD% ~ dp0. [https: // ss64.com/ nt / syntax-args .html] ha di più sui parametri (% ~).
Nota che l'uso di (: :) all'inizio di una riga la rende una riga di commento. Ancora più importante, l'uso di :: consente di includere redirector, pipe, caratteri speciali (cioè <> | ecc) in quel commento.
:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt
Naturalmente, Powershell fa questo e molto altro.
set batdir=%CD%
). Non va bene, perché è il percorso del chiamante, non il file bat stesso. L'unico modo valido per ottenere il percorso del file bat in esecuzione è %~dp0
.