시스템 변수를 다른 변수 안에 전달

시스템 변수를 다른 변수 안에 전달

내 문제: 다양한 엔지니어링 리소스를 가리키는 특정 아이콘을 사용자 데스크탑에 복사해야 합니다. 이 아이콘은 다소 정기적으로 업데이트됩니다. 내 초기 배치 파일은 단순히 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%\desktopOR 중 하나를 얻습니다"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에서 '사용자'를 삭제하세요.

관련 정보