1 votos

Lote: establecer el nombre de la carpeta de nivel superior como variable

Entorno: Windows 10
Pregunta: Si es posible, ¿cómo podemos establecer el nombre de la carpeta de nivel superior en una unidad como una variable?

Recibimos un disco a partir de una tercera parte, que contiene las actualizaciones de un sistema de uso - en el disco hay una carpeta con la versión actual del título (por ejemplo, blahblahSystemblah-2018October-finalblah) y contiene todos los datos de esa versión. Después de colocar el disco en el sistema que usar robocopy para actualizar el servidor con los cambios y, a continuación, los usuarios que ejecuten el sistema después de que se actualiza por el servidor. Nuestros problemas actuales son los que tenemos que poner el nombre de la carpeta manualmente, ya robocopy no puede (a mi conocimiento) utilizar un comodín en su origen, el nombre de la carpeta es importante en otros lugares, así que no podemos simplemente llegar a poner el contenido directamente en el disco, e idealmente, nos gustaría no tener que mover el archivo de proceso por lotes antes de ejecutarlo (utilizando el directorio actual sería fácil, pero como ya he dicho: el nombre de la carpeta es importante, y estamos tratando de mantener ningún manual de entrada/esfuerzo de los usuarios al mínimo).

La parte pertinente de la secuencia de comandos tendría este aspecto:

@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 cercano que pude encontrar para llegar allí es este pedazo de secuencia de comandos, donde "knownfile" 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 escupe más que solo la carpeta con ese archivo conocidos, y también de los clips el primer carácter del nombre de la carpeta. Yo voy a ser el primero en admitir que no estoy totalmente de entender la sintaxis o a dónde va mal, así que si alguien puede me apunte en una dirección mejor o que me ayudará a refinar el anterior código único retorno que una carpeta, sería muy apreciada.

0voto

Worthwelle Puntos 73

Usted puede 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%

Screenshot

donde la knownfile variable de entorno es la ruta de acceso completa sin las comillas. No es necesario habilitar la Expansión Retardada para esta solución o meterse con la CD variable de entorno.

Con for /R, usted está caminando a través de un árbol de directorios, mientras que for /F es simplemente el procesamiento de una cadena y división en la \ carácter.

tokens=1 le indica que utilice la primera parte de la cadena. Si desea utilizar cualquiera de las carpetas después de eso, puede hacerlo mediante el uso de tokens=1,2,3 y, a continuación, set prev=.\%%G\%%H\%%I

Si quería conseguir la letra de la unidad, en lugar de utilizar .\, usted podría utilizar set prev=%%~dG\%%~G

Leer más:

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: