2014-09-01 2 views
1

У меня есть этот путь: C:\dev\app\tomcat\apache-tomcat-base хранится как переменная copyFile внутри пакетного файла.Получить имя папки из пути в пакетном файле. Не разрешать

Я использую следующий код, чтобы попытаться получить apache-tomcat-base (имя папки) в качестве новой переменной copyfolderName

for /f "delims=" %%F in ("%copyFile%") do (
     set copyfolderName=%%~nxF 
) 

однако copyFolderName заканчивается пустыми.

Примечание: Цикл никогда не быть введен

Взято из этого фрагмента:

:: Check if the file to be copied is a directory of file. If a directory define %isDirect% 
IF exist "%copyFile%\" set isDirect=directory 
:: Copy folder with all contents 
IF defined isDirect (
    ::Get name of folder for the copyingDirectory folder 
    for /f "delims=" %%F in ("%copyFile%") do (
     echo setting %%~nxF 
     set copyfolderName=%%~nxF 
    ) 
    echo BASE NAME: %copyfolderName% 
) 

ОСНОВА ИМЯ печатает ничего

+0

'Примечание: петля никогда не вводится'? Но в цикле есть место, где вы получаете имя папки? Или что-то мне не хватает ... – npocmaka

+0

как в. Если я добавлю эхо в цикл for, он никогда не будет вызван. – mangusbrother

+0

, вероятно, вам нужно добавить весь код. Проблема не в выдержке выше. – npocmaka

ответ

3
.... 
setlocal enabledelayedexpansion 
echo BASE NAME: !copyfolderName! 
endlocal 
.... 

Когда CMD анализатор читает строку или блок (код внутри скобки), все переменные считаются заменяемыми значением внутри переменной до, начиная с exec ute код. Если выполнение кода в блоке изменяет значение переменной, это значение не может быть видно изнутри того же блока, поскольку операция чтения в переменной не существует, поскольку она была заменена значением в переменной.

Для его решения вам необходимо включить замедленное расширение и, при необходимости, изменить синтаксис с %var% на !var!, указав парсеру, что операция чтения должна быть отложена до выполнения команды.

+1

+1, только что собирался ответить :-) – npocmaka

+0

работал как шарм – mangusbrother

+0

@npocmaka, я знаю, как это :-) Обычно я начинаю печатать, и, делая это, я заканчиваю видя, как foxidrive отправляет то же самое или лучшее решение. –

0

Добавление SETLOCAL enabledelayedexpansion решит проблему (я использовал тестовую папку в коде ниже) -

:: Check if the file to be copied is a directory of file. If a directory define %isDirect% 
@echo off 
set "copyfile=c:\drivers\test folder" 
IF exist "%copyFile%\" set isDirect=directory 
:: Copy folder with all contents 
setlocal enabledelayedexpansion 
IF %isDirect% equ directory (
    ::Get name of folder for the copyingDirectory folder 
    for /f "delims=" %%F in ("%copyFile%") do (
     echo setting %%~nxF 
     set copyfolderName=%%~nxF 
    ) 
    echo BASE NAME: %copyfolderName% 
) 

Испытано выход -

D:\Scripts>draft.bat 
setting test folder 
BASE NAME: test folder 

Cheer, G

+0

попробуйте в новом сеансе командной строки :-) – npocmaka

0

Если вы хотите чтобы сделать это таким образом, учтите следующее:

setlocal EnableDelayedExpansion 
IF exist "!copyFile!" (set isDirect=directory 
    for /f %%F in ("!copyFile!") do (
     echo setting %%~nxF 
     set copyfolderName=%%~nxF 
    ) 
    echo BASE NAME: !copyfolderName! 
) 
Смежные вопросы