Пакет: Установить имя папки верхнего уровня как переменную

Пакет: Установить имя папки верхнего уровня как переменную

Среда:Виндовс 10
Вопрос:Если возможно, как задать имя самой верхней папки на диске в качестве переменной?

Мы получаем диск от третьей стороны, который содержит обновления для используемой нами системы — на диске есть папка с названием текущей версии (например, blahblahSystemblah-2018October-finalblah), и она содержит все данные этой версии. После того, как мы помещаем диск в систему, мы используем robocopy для обновления сервера с изменениями, а затем пользователи, которые запускают систему после этого, обновляются сервером. Наши текущие проблемы заключаются в том, что нам приходится вручную задавать имя папки, поскольку robocopy не может (насколько мне известно) использовать подстановочный знак в своем источнике, имя папки важно в другом месте, поэтому мы не можем просто заставить их поместить содержимое непосредственно на диск, и в идеале мы хотели бы не перемещать пакетный файл перед его запуском (использование текущего каталога было бы простым, но, как я уже сказал: имя папки важно, и мы пытаемся свести любой ручной ввод/усилия со стороны пользователей к минимуму).

Соответствующая часть сценария будет выглядеть так:

@echo off
for (however you can get the top folder name automatically) do (set VRSN=however)

robocopy "D:\VRSN" "C:\local\directory" /e /mir /r:0 /w:0 /log:"C:\log\directory.txt"

Самое близкое, что мне удалось найти, чтобы добиться этого, — это этот фрагмент скрипта, где «knownfile» — это имя файла, который всегда будет находиться в папке:

setlocal enabledelayedexpansion

cd /d "D:\"

for /R %%G in (knownfile) do (
    set "var1=%%~dpG"
    set "var1=!var1:%CD%=!"
    if not "!var1!"=="!prev!" (
        if "!var1!"=="\" (echo .\) else echo(!var1:~1,-1!
    )
    set "prev=!var1!"
)

-- но этот скрипт выдает больше, чем просто папку с известным файлом, и он также обрезает первый символ имени папки. Я буду первым, кто признает, что не до конца понимаю синтаксис или где он идет не так, так что если кто-то может указать мне лучшее направление или помочь мне улучшить код выше, чтобытолькоВерните эту папку, я был бы очень признателен.

решение1

Вы можете использовать что-то простое, например:

@ECHO off
set knownfile=D:\Folder\File.txt

for /F "delims=\ tokens=2" %%G in ("%knownfile%") do (
    set prev=.\%%G
)

ECHO %prev%

Скриншот

где knownfileпеременная окружения — это полный путь без кавычек. Вам не нужно включать отложенное расширение для этого решения или возиться с CDпеременной окружения.

С помощью for /Rвы проходите по дереву каталогов, тогда как for /Fпросто обрабатываете строку и разбиваете ее на \символы.

tokens=1говорит ему использовать первую часть строки. Если вы хотите использовать любые папки после этого, вы можете сделать это с помощью tokens=1,2,3и затемset prev=.\%%G\%%H\%%I

Если вы хотите получить букву диска, вместо использования .\, вы можете использоватьset prev=%%~dG\%%~G

Дальнейшее чтение:

Связанный контент