
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%
onde a knownfile
variável de ambiente é o caminho completo sem aspas. Você não precisa habilitar a expansão atrasada para esta solução ou mexer na CD
variável de ambiente.
Com for /R
, você percorre uma árvore de diretórios, enquanto for /F
simplesmente processa uma string e a divide no \
caractere.
tokens=1
diz para usar a primeira parte da string. Se você quiser usar alguma pasta depois disso, poderá fazer isso usando tokens=1,2,3
e depoisset prev=.\%%G\%%H\%%I
Se você quisesse obter a letra da unidade, em vez de usar .\
, você poderia usarset prev=%%~dG\%%~G