Mi problema: necesito copiar íconos específicos en los escritorios de los usuarios que apuntan a varios recursos de ingeniería. Estos íconos se actualizan con cierta regularidad. Mi archivo por lotes inicial simplemente se estaba usando robocopy
para hacer esto y funcionó perfectamente.
robocopy "[NetworkDrive]\folderX\Desktop" "%userprofile%\Desktop"
Al menos así fue para la mayoría de la gente. A medida que implementamos office365 y onedrive, las personas sincronizan su escritorio. En este caso, %userprofile%\desktop no es la ubicación del escritorio. Es algo muy diferente:
c:\users\username\one_drive_enterprise_name\Desktop
Entonces ajusté mi lote así:
set KEY_NAME="HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
set VALUE_NAME="Desktop"
FOR /F "skip=2 tokens=2,*" %%A IN ('reg.exe query %KEY_NAME% /v %VALUE_NAME%') DO SET LUD=%%B
echo "%LUD%"
robocopy "[NetworkDrive]\folderX\Desktop" "%LUD%"
%LUD%
devuelve la clave apropiada para el usuario dado.
Obtengo O %userprofile%\desktop
O"c:\users\username\one_drive_enterprise_name\Desktop."
Pero cuando paso %LUD%
dentro de robocopy, lo toma como ruta literal y le antepone la ubicación actual del archivo por lotes.
c:\users\current user\desktop\userprofile\desktop como ejemplo.
Termino con una nueva carpeta llamada %userprofile% en el escritorio con una subcarpeta llamada Escritorio. :)
¿Cómo paso lo apropiado usando otro If>Then con rutas simples codificadas?
gracias kevin
Respuesta1
El problema es que el valor de la LUD
variable contiene %
caracteres para hacer referencia a otra variable.
Quizás haya una manera más eficiente, pero podrías hacer algo como esto:
echo set folder=%LUD% > "%TEMP%\setfolder.bat"
call "%TEMP%\setfolder.bat"
del "%TEMP%\setfolder.bat"
echo %folder%
Respuesta2
Algo como esto debería solucionarlo, obtiene el contenido de las variables dentro de %LUD% en lugar de la variable misma:
para /f "delims=" %%a en ('echo %LUD%') configure LUD=%%a
@echo off
set KEY_NAME="HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
set VALUE_NAME="Desktop"
FOR /F "skip=2 tokens=2,*" %%A IN ('reg.exe query %KEY_NAME% /v %VALUE_NAME%') DO SET LUD=%%B
for /f "delims=" %%a in ('echo %LUD%') do set LUD=%%a
robocopy "[NetworkDrive]\folderX\Desktop" "%LUD%"
Respuesta3
Al hablar con algunos compañeros de trabajo, tengo otras dos opciones...
1: simplemente use el escritorio público para todos y déjelo listo. C:\usuarios\público\escritorio
2 - utilice la tecla "Carpeta Shell" en lugar de "Carpeta Shell de usuario". ¿Por qué? porque la clave 'carpeta shell' solo contiene las rutas reales, no variables. OIA, elimina 'usuario' de KEY_NAME.