내 문제: 다양한 엔지니어링 리소스를 가리키는 특정 아이콘을 사용자 데스크탑에 복사해야 합니다. 이 아이콘은 다소 정기적으로 업데이트됩니다. 내 초기 배치 파일은 단순히 robocopy
이 작업을 수행하는 데 사용되었으며 완벽하게 작동했습니다.
robocopy "[NetworkDrive]\folderX\Desktop" "%userprofile%\Desktop"
적어도 대부분의 사람들에게는 그랬습니다. Office365와 OneDrive를 배포하면 사람들이 데스크톱을 동기화하고 있습니다. 이 경우 %userprofile%\desktop은 데스크탑의 위치가 아닙니다. 뭔가 많이 다릅니다:
c:\users\username\one_drive_enterprise_name\Desktop
그래서 배치를 다음과 같이 조정했습니다.
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%
주어진 사용자에게 적절한 키를 반환합니다.
나는 %userprofile%\desktop
OR 중 하나를 얻습니다"c:\users\username\one_drive_enterprise_name\Desktop."
그러나 robocopy 내부를 전달하면 %LUD%
이를 리터럴 경로로 사용하고 배치 파일의 현재 위치를 앞에 붙입니다.
예를 들어 c:\users\현재 사용자\desktop\userprofile\desktop입니다.
데스크탑에 %userprofile%라는 새 폴더와 Desktop이라는 하위 폴더가 생겼습니다. :)
간단한 하드 코딩된 경로를 사용하여 다른 If>Then을 사용하여 해당 항목을 어떻게 전달합니까?
고마워요 케빈
답변1
문제는 변수 값에 다른 변수를 참조하는 문자가 LUD
포함되어 있다는 것입니다.%
어쩌면 더 효율적인 방법이 있을 수도 있지만 다음과 같이 할 수도 있습니다.
echo set folder=%LUD% > "%TEMP%\setfolder.bat"
call "%TEMP%\setfolder.bat"
del "%TEMP%\setfolder.bat"
echo %folder%
답변2
다음과 같이 하면 문제가 해결됩니다. 변수 자체가 아닌 %LUD% 내부의 변수 내용을 가져옵니다.
for /f "delims=" %%a in ('echo %LUD%') do set 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%"
답변3
몇몇 동료들과 이야기를 나누다 보면 두 가지 다른 옵션이 있습니다.
1 - 모든 사람이 공용 데스크탑을 사용하고 하루를 보내십시오. C:\사용자\공개\데스크탑
2 - "사용자 셸 폴더" 대신 "셸 폴더" 키를 사용합니다. 왜? '셸 폴더' 키에는 실제 경로만 포함되고 변수는 포함되지 않기 때문입니다. IOW, KEY_NAME에서 '사용자'를 삭제하세요.