1

Окружающая среда: Windows 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 ответ1

0

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

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

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

ECHO %prev%

Скриншот

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .