
Ambiente:ventanas 10
Pregunta:Si es posible, ¿cómo configuramos el nombre de la carpeta superior en una unidad como variable?
Recibimos un disco de un tercero que contiene actualizaciones de un sistema que utilizamos; en el disco hay una carpeta con el título de la versión actual (p. ej. blahblahSystemblah-2018October-finalblah
) y contiene todos los datos de esa versión. Después de colocar el disco en el sistema, usamos robocopy para actualizar el servidor con los cambios, y luego el servidor actualiza a los usuarios que ejecutan el sistema después de eso. Nuestros problemas actuales son que tenemos que configurar el nombre de la carpeta manualmente ya que robocopy no puede (que yo sepa) usar un comodín en su fuente, el nombre de la carpeta es importante en otros lugares, por lo que no podemos simplemente hacer que coloquen el contenido directamente en el disco. , e idealmente no nos gustaría tener que mover el archivo por lotes antes de ejecutarlo (usar el directorio actual sería fácil, pero como dije: el nombre de la carpeta es importante y estamos tratando de evitar cualquier entrada/esfuerzo manual usuarios al mínimo).
La parte relevante del guión se vería así:
@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"
Lo más parecido que pude encontrar es este fragmento de script, donde "archivo conocido" es el nombre de un archivo que siempre estará en la carpeta:
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!"
)
-- pero este script muestra algo más que la carpeta con ese archivo conocido, y también recorta el primer carácter del nombre de la carpeta. Seré el primero en admitir que no entiendo completamente la sintaxis o dónde está fallando, así que si alguien pudiera indicarme una mejor dirección o ayudarme a refinar el código anterior parasoloDevuelva esa carpeta, se lo agradecería mucho.
Respuesta1
Puedes usar algo tan simple como:
@ECHO off
set knownfile=D:\Folder\File.txt
for /F "delims=\ tokens=2" %%G in ("%knownfile%") do (
set prev=.\%%G
)
ECHO %prev%
donde la knownfile
variable de entorno es la ruta completa sin comillas. No es necesario habilitar la expansión retrasada para esta solución ni alterar la CD
variable de entorno.
Con for /R
, estás recorriendo un árbol de directorios, mientras que for /F
simplemente procesas una cadena y la divides por el \
carácter.
tokens=1
le dice que use la primera parte de la cadena. Si desea utilizar alguna carpeta después de eso, puede hacerlo usando tokens=1,2,3
y luegoset prev=.\%%G\%%H\%%I
Si desea obtener la letra de la unidad, en lugar de usar .\
, puede usarset prev=%%~dG\%%~G