2010-10-03 39 views
6

Nel mio script bat, chiamo un altro script e passando un parametro stringabat nome della cartella corrente

cscript log.vbs "triggered from folder <foldername> by Eric" 

Il parametro di stringa, come potete vedere contiene il nome della cartella da cui lo script è essere chiamato. Qual è il modo giusto per passare questo in modo dinamico inserire il nome della cartella nello script?

risposta

18

Se si desidera che la directory in cui si è attualmente in, è possibile ottenere che da %cd%. Questa è la tua attuale directory di lavoro.

Se avete intenzione di essere cambiare la directory di lavoro corrente durante l'esecuzione dello script, basta salvarlo alla partenza:

set startdir=%cd% 

quindi è possibile utilizzare %startdir% nel codice indipendentemente da eventuali modifiche in seguito on (che influisce su %cd%).


Se si desidera ottenere l'ultimo componente di quel percorso (secondo il vostro commento), è possibile utilizzare il seguente come una linea di base:

 
    @setlocal enableextensions enabledelayedexpansion 
    @echo off 
    set startdir=%cd% 
    set temp=%startdir% 
    set folder= 
:loop 
    if not "x%temp:~-1%"=="x\" (
     set folder=!temp:~-1!!folder! 
     set temp=!temp:~0,-1! 
     goto :loop 
    ) 
    echo.startdir = %startdir% 
    echo.folder = %folder% 
    endlocal && set folder=%folder% 

Questo uscite:

 
    C:\Documents and Settings\Pax> testprog.cmd 
    startdir = C:\Documents and Settings\Pax 
    folder = Pax 

Funziona copiando i caratteri dalla fine del percorso completo, uno alla volta, finché non trova il separatore \. Non è né bella né efficiente, ma la programmazione in batch di Windows è raramente :-)

EDIT

In realtà, c'è un metodo semplice e molto efficiente per ottenere l'ultimo nome del componente.

for %%F in ("%cd%") do set "folder=%~nxF" 
Non

un problema per questa situazione, ma se si tratta di una variabile che contiene un percorso che può o non può terminare con \, allora si può garantire il risultato corretto aggiungendo \.

for %%F in ("%pathVar%\.") do set "folder=%~nxF" 
+1

@Berming, ho aggiunto il codice che ti darà l'ultimo componente del percorso. Guarda l'aggiornamento. – paxdiablo

+0

Proprio quello di cui avevo bisogno, grazie mille. Ho notato però che quando ho 'endlocal' dopo non posso accedere alla variabile' folder', quindi ho eliminato quella linea. Ho pensato che da quando ho rimosso quella linea, dovrei rimuovere anche la '@setlocal enableextensions enabledelayedexpansion' in alto, ma rimuovere quella linea ha causato problemi, quindi l'ho mantenuta. – Berming

+2

@Berming, vedere l'aggiornamento. Se lasci fuori il 'endlocal', ciò ti influenzerà in seguito.Puoi _still_ usare 'setlocal/endlocal' per assicurarti che l'espansione ritardata funzioni ma modifica' endlocal' in 'endlocal && set folder =% folder%' in modo che la variabile 'folder' sfugga. – paxdiablo

8
+1

Questo dà la cartella in cui è memorizzato lo script bat, che può o non può essere lo stesso di dove viene chiamato lo script, quindi non funziona nel mio caso, perché quasi sempre viene chiamato da una posizione diversa che è diversa da dove viene effettivamente memorizzato lo script. – Berming

+1

Giusto! Scusate. OK, lascerò qui questa risposta come riferimento: qualcuno potrebbe trovare '% ~ dp0' utile per determinati scopi. – Isaac

Problemi correlati