2010-10-03 12 views
6

W moim skryptu bat, dzwonię inny scenariusz i przekazując jej parametr ciąg.bat obecna nazwa folderu

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

Parametr ciąg jak widać zawierający nazwę folderu, z którego skrypt jest być nazwanym. Jaki jest właściwy sposób przekazania tego dynamicznie wstawić nazwę tego skryptu do skryptu?

Odpowiedz

18

Jeśli chcesz katalog, w którym jesteś obecnie, że można dostać od %cd%. To jest twój aktualny katalog roboczy.

Jeśli masz zamiar być zmieniając Twój bieżący katalog roboczy podczas wykonywania skryptu, wystarczy zapisać go na początku:

set startdir=%cd% 

następnie można wykorzystać %startdir% w kodzie, niezależnie od wszelkich zmianach później on (co wpływa na %cd%).


Jeśli tylko chcesz dostać ostatnią składową tej ścieżce (jak na swoje komentarzu), można użyć następujących jako punkt odniesienia:

 
    @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% 

This Wyjścia:

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

Działa poprzez kopiowanie znaków od końca pełnej ścieżki, pojedynczo, aż znajdzie separator \. To ani ładna, ani wydajne, ale programowanie partii Okna rzadko jest :-)

EDIT

Faktycznie, nie jest to prosta i bardzo skuteczna metoda, aby uzyskać nazwisko komponentu.

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

nie problem dla tej sytuacji, ale jeśli masz do czynienia ze zmienną zawierającą ścieżkę, która może lub nie może zakończyć się \, wtedy można zagwarantować prawidłowy wynik przez dołączenie \.

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

@Berming, dodałem kod, który da ci ostatni składnik ścieżki. Zobacz aktualizację. – paxdiablo

+0

Właśnie to, czego potrzebowałem, dziękuję bardzo. Zauważyłem jednak, że kiedy 'endlocal' nie mogę uzyskać dostępu do zmiennej' folder' po tym, więc wyjąłem tę linię. Pomyślałem, że odkąd usunąłem tę linię, powinienem również usunąć "@ setlocal enableextensions enabledelayedexpansion" na górze, ale usunięcie tej linii spowodowało problemy, więc zachowałem to. – Berming

+2

@Berming, zobacz aktualizację. Jeśli opuścisz 'endlocal', wpłynie to na ciebie później.Możesz _still_ użyć 'setlocal/endlocal', aby upewnić się, że opóźnione rozszerzenie działa, ale zmodyfikuj' endlocal' na 'endlocal && set folder =% folder%', tak aby zmienna 'folder' została usunięta. – paxdiablo

8
+1

Daje to folder, w którym przechowywany jest skrypt nietoperza, który może być lub nie być tym samym, co skąd skrypt jest wywoływany, więc nie działa w moim przypadku, ponieważ prawie zawsze jest wywoływany z innej lokalizacji, która jest inna skąd skrypt jest rzeczywiście przechowywany. – Berming

+1

Dobrze! Przepraszam. OK, zostawię tę odpowiedź tutaj jako odniesienie - ktoś może znaleźć '% ~ dp0' przydatny do pewnych celów. – Isaac