Lote: definir o nome da pasta de nível superior como variável

Lote: definir o nome da pasta de nível superior como variável

Ambiente:Janelas 10
Pergunta:Se possível - como definimos o nome da pasta superior em uma unidade como uma variável?

Recebemos um disco de terceiros que contém atualizações para um sistema que usamos - no disco há uma pasta com o título da versão atual (por exemplo, blahblahSystemblah-2018October-finalblah) e contém todos os dados dessa versão. Depois de colocarmos o disco no sistema usamos o robocopy para atualizar o servidor com as alterações, e então os usuários que executam o sistema depois disso são atualizados pelo servidor. Nossos problemas atuais são que temos que definir o nome da pasta manualmente, já que o robocopy não pode (que eu saiba) usar um curinga em sua fonte, o nome da pasta é importante em outro lugar, então não podemos simplesmente fazer com que eles coloquem o conteúdo diretamente no disco , e idealmente não gostaríamos de ter que mover o arquivo em lote antes de executá-lo (usar o diretório atual seria fácil, mas como eu disse: o nome da pasta é importante e estamos tentando manter qualquer entrada/esforço manual de usuários ao mínimo).

A parte relevante do script ficaria assim:

@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"

A coisa mais próxima que encontrei de chegar lá é este pedaço de script, onde "knownfile" é o nome de um arquivo que sempre estará na pasta:

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!"
)

- mas esse script exibe mais do que apenas a pasta com aquele arquivo conhecido e também corta o primeiro caractere do nome da pasta. Serei o primeiro a admitir que não entendo completamente a sintaxe ou onde ela está errada, então se alguém puder me indicar uma direção melhor ou me ajudar a refinar o código acima paraapenasretornar aquela pasta, ficaria muito grato.

Responder1

Você pode usar algo tão simples como:

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

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

ECHO %prev%

Captura de tela

onde a knownfilevariável de ambiente é o caminho completo sem aspas. Você não precisa habilitar a expansão atrasada para esta solução ou mexer na CDvariável de ambiente.

Com for /R, você percorre uma árvore de diretórios, enquanto for /Fsimplesmente processa uma string e a divide no \caractere.

tokens=1diz para usar a primeira parte da string. Se você quiser usar alguma pasta depois disso, poderá fazer isso usando tokens=1,2,3e depoisset prev=.\%%G\%%H\%%I

Se você quisesse obter a letra da unidade, em vez de usar .\, você poderia usarset prev=%%~dG\%%~G

Leitura adicional:

informação relacionada