
Среда:Виндовс 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