2013-02-10 3 views
3

В подпрограмме% 0 расширяет имя подпрограммы, а не имя сценария. Есть ли лигитивный способ доступа к имени скрипта, или я должен передать его в качестве аргумента?Получить имя командного файла из подпрограммы

@echo off 

call :subroutine %~f0 my parameters 
exit /b 

:subroutine 
shift 
echo Script name is %0 
echo Parameters: %1 %2 
exit /b 

Я хочу, чтобы оператор вызова, чтобы быть просто

call :subroutine my parameters 

ответ

4

В функции вам необходимо добавить по крайней мере один модификатор %~0.

call :test 
exit /b 

:test 
echo 0 %0 - shows "test" 
echo ~0 %~0 - shows "test" 
echo ~f0 %~f0 - shows the batch name (full path) 
exit /b 
+0

Спасибо. Я уже заметил это после прочтения http://stackoverflow.com/questions/14559789/printing-a-paragraph-in-windows-batch. – utapyngo

2

Я считаю,% ~ nx0 даст вам имя файла с расширением и% ~ n0 даст вам только имя файла ...

1

Я предпочитаю использовать это в верхней части моих скриптов:

set "This=%~dpnx0" 

Таким образом, вы по-прежнему держать полный путь запущенного сценария. Если есть необходимость получить только имя скрипта, вы можете использовать цикл FOR/F, чтобы извлечь его:

set "This=%~dpnx0" 
echo This=%This% 
for /F %%I in ('echo.%This%') do set "Name=%%~nxI" 
echo Name=!Name! 
+0

Раньше я считал, что глобальные переменные являются плохими. Но похоже, что это не так. – utapyngo

+0

@utapyngo: Это в основном верно, но поскольку нет способа определить постоянные значения в пакетном сценарии Windows, я думаю, что это приемлемое исключение. :) – mrt

+1

Ну, я думаю, вы могли бы просто «установить» Name =% ~ nx0 «' в начале. :) По крайней мере, ваша петля кажется немного излишней, вы можете иметь более простой вариант: 'for %% I in («% this% ») установить« Name = %% ~ nxI »'. –

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