Reindirizza l'output batch al comando cd
Ho un file batch che restituisce un percorso. Come posso utilizzare il file batch in Windows cmd per modificare la directory corrente?
Cosa ho provato:
F:\>cd my-path.bat
The system cannot find the path specified.
F:\>cd (my-path.bat)
The system cannot find the path specified.
F:\>my-path.bat | cd
F:\
The process tried to write to a nonexistent pipe.
contenuto my-path.bat:
@ECHO OFF
@ECHO F:\MyPath\
Risposte
for /f "delims=" %d in ('my-path.bat') do cd /d "%~d"
Nota: in un file batch devi sostituire% con %%
Per diversi driver hai bisogno /ddel tuo cdcomando
Se la cartella / il percorso / il nome hanno spazi / caratteri speciali, utilizzare anche le "virgolette doppie"
@echo off
echo\"F:\path to your folder"
:: or add/replace echo\"F:\path to your folder" to cd /d ::
cd /d "F:\path\to\folder"
Un'alternativa sarebbe quella di ottenere l'output in un ciclo, in cui la mazza non verrebbe modificata, ma solo la riga di comando ...
for /f tokens^=* %i in ('^<con: "my-path.bat"')do cd/d "%~i"
- Ricordando che le variabili di ciclo
%iin bat sono%%i:
for /f tokens^=* %%i in ('^<con: "my-path.bat"')do cd/d "%%~i"
- Puoi usare arguments (
%*) per eseguire il comando variabile:
@echo off
<con: call %* "F:\path to your folder" 2>nul || echo\"F:\path to your folder"
La 2>nulsoppressione di ogni possibile errore e se l'ultimo comando non restituisce 0, un semplice eco interverrà ...
Usando argomenti nella tua mazza:
my-path.bat cd /d
Qualche ulteriore lettura:
[√] "Cd / d"
[√] "Per"
[√] "Per / F"
[√] Reindirizzamenti nel file bat
[√] Esecuzione condizionale ||e&&
[√] Come posso passare argomenti a un file batch
[√] Comprensione di inizio, "2> nul", "cmd" e altri simboli in un file batch
Perché non modificare semplicemente il file Batch in:
@echo off
cd F:\MyPath\
Basandosi sulla risposta di LeRouteur , il seguente potrebbe essere un utile compromesso:
@echo off
if "%~1" == "." cd /d F:\mypath && goto :eof
echo F:\mypath
L'esecuzione my-pathfarà semplicemente l' eco del percorso, come fa attualmente, ma l'esecuzione my-path .(cioè con un solo punto come parametro) cambierà in quel percorso.
Se non ti piace avere il percorso inserito due volte, questo può essere evitato utilizzando una variabile d'ambiente, ma per farlo in modo "pulito" (senza inquinare l'ambiente esistente) ha bisogno di un piccolo pensiero:
@echo off
setlocal
set "MYPATH=F:\mypath"
if "%~1" == "." (
endlocal && cd /d "%MYPATH%"
goto :eof
)
echo "%MYPATH%"
L'uso di setlocalsignifica che qualsiasi modifica all'ambiente (ad esempio MYPATH) verrà effettuata solo localmente: l'esecuzione endlocalo il raggiungimento della fine del file batch tornerà all'ambiente originale (vedere setlocal /?e endlocal /?).
L'uso setlocalè molto comune nei file batch in modo che qualsiasi variabile di ambiente che usano / modificano non "inquini" l'ambiente principale. Il problema è che la directory corrente fa parte di ciò che è localizzato: se esegui cdmentre setlocalè attivo , tornerai alla directory iniziale quando lo script esce.
Una soluzione è mettere i comandi endlocale cdsulla stessa riga. Il modo in cui vengono analizzati i file batch significa che la valutazione di MYPATHavviene mentre l'ambiente è ancora "locale" (quindi ha ancora il valore corretto), ma l' esecuzione del cdcomando (utilizzando il valore che è stato ottenuto nel primo passaggio) non non accadrà fino a quando non sarà stato endlocaleseguito, il che significa che la directory verrà modificata quando tornerà alla riga di comando.
Il modo in cui definisco MYPATHe utilizzo il suo valore (racchiuso tra virgolette doppie) consente al percorso di contenere spazi. Forse non è necessario qui, ma è una buona abitudine da prendere quando si scrivono file batch.
Come opzione finale, potresti sostituire cd /dcon pushd. Quest'ultimo "spinge" la directory corrente in uno stack prima di passare a quella nuova (vedere pushd /?). Quando hai finito di fare tutto ciò che devi fare MYPATH, puoi quindi correre popdper tornare alla directory da cui sei stato originariamente eseguito my-path ..