2010-10-03 4 views
6

В моем битом сценарии, я звоню другой сценарий и передавая ему строковый параметр.bat имя текущей папки

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

Строкового параметр, как вы можете видеть, содержит имя папки, из которой скрипт называемый. Каков правильный способ передать это динамически вставить это имя папки в скрипт?

ответ

18

Если вы хотите каталог, в котором вы находитесь в данный момент на, вы можете получить, что с %cd%. Это ваш текущий рабочий каталог.

Если вы собираетесь быть изменения текущий рабочий каталог во время выполнения скрипта, просто сохраните его в начале:

set startdir=%cd% 

, то вы можете использовать %startdir% в вашем коде, независимо от каких-либо изменений позже (которые влияют на %cd%).


Если вы просто хотите, чтобы получить последний компонент этого пути (как на ваш комментарий), вы можете использовать следующие в качестве основы:

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

Это выходы:

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

Он работает, копируя символы с конца полного пути, по одному, пока не найдет разделитель \. Это ни очень, ни эффективное, но партия программирование для Windows редко :-)

EDIT

На самом деле, есть простой и очень эффективный метод, чтобы получить последнее имя компоненты.

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

не является проблемой для этой ситуации, но если вы имеете дело с переменной, содержащей путь, который может или не может заканчиваться \, то вы можете гарантировать правильный результат, прилагая \.

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

@Berming, я добавил код, который даст вам последний компонент пути. См. Обновление. – paxdiablo

+0

Только то, что мне было нужно, большое спасибо. Я заметил, что когда я 'endlocal', после этого я не могу получить доступ к переменной' folder', поэтому я достал эту строку. Я понял, что с тех пор, как я удалил эту строку, я также должен удалить «@setlocal enableextensions enabledelayedexpansion» вверху, но удаление этой строки вызвало проблемы, поэтому я сохранил ее. – Berming

+2

@Berming, см. Обновление. Если вы оставите «endlocal», это повлияет на вас позже.Вы можете _still_ использовать 'setlocal/endlocal', чтобы убедиться, что замедленное расширение работает, но измените' endlocal' на 'endlocal && set folder =% folder%', чтобы сместилась переменная 'folder'. – paxdiablo

8
+1

Это дает папку, в которой хранится скрипт bat, который может или не может совпадать с именем сценария, поэтому он не работает в моем случае, потому что почти всегда он вызывается из другого места, которое отличается откуда собственно хранится сценарий. – Berming

+1

Правильно! Сожалею. Хорошо, я оставлю этот ответ здесь как ссылку - кто-то может найти '% ~ dp0' полезный для определенных целей. – Isaac

Смежные вопросы