명령에 레지스트리에서 환경 변수 사용


6

상황에 맞는 메뉴에서 인수를 요구하는 프로그램을 만들고 있습니다 (파일을 클릭하고 매개 변수로 파일 이름과 함께 프로그램을 호출합니다).

... \ shell \ myThing \ command에 레지스트리 키를 추가하려고합니다. 제가하고 싶은 것은 다음과 같습니다 :

C:\Program Files (x86)\Feliratozo\Feliratozo.exe %1

% ProgramFiles (x86) % 환경 변수를 사용하고 싶습니다. 왜냐하면 x86 및 x64 Windows에서도 잘 작동한다는 것을 읽었 기 때문입니다. (x86의 "normal"Program Files로 변경). 설정하려고 할 때 문제가 발생합니다.

%ProgramFiles(x86)%\Feliratozo\Feliratozo.exe %1

이렇게하면 컨텍스트 메뉴 항목을 사용하려고하면 다음과 같은 오류가 발생합니다.

Windows cannot access the specified device, path, or file. You may not have the appropriate permissions to access the item.

절대 경로를 사용할 때 작동하기 때문에 권한 문제가 올바르지 않은 것 같습니다.

내가 지금 무엇을 할 수 있을까?


4
레지스트리 설정을 REG_SZ 대신 REG_EXPAND_SZ로 변경하는 것을 잊지 마십시오!
Werner Henze

1
그런데, 당신의 전제의 일부가 잘못되었습니다. 32 비트 PC에서는 env var % ProgramFiles (x86) %를 평가할 수 없습니다. '지정한 경로를 찾을 수 없습니다.'라는 메시지가 나타납니다. 개인적으로 경로 지정 관점에서 볼 때, 호스트의 딱딱한 정도에 관계없이 항상 이전의 '% ProgramFiles %'를 사용하는 것이 더 좋습니다.
Frank Thomas

1
둘 다 고마워. 베르너 헨 제, 당신이 대답을한다면, 나는 그것을 받아 들일 수 있습니다, 당신의 의견에 대해 투표를 할 수는 없습니다.
Martin Fejes

@ 마틴 Fejes : 대답했다. 테스트를하고 효과가있는 경우에만 수락하십시오. Explorer가 이러한 레지스트리 키에서 환경 변수를 확장하고 있는지 확실하지 않습니다.
Werner Henze

답변:


11

REG_SZ 대신 REG_EXPAND_SZ 레지스트리 값을 만들어야합니다. 일반적으로 REG_EXPAND_SZ 값만 확장됩니다.


2
값이 (Default)키가되면 레지스트리 편집기 GUI를 통해 해당 유형을 변경할 수 없습니다. 이 문제를 해결하려면 수동으로 키를 만듭니다. Admin PowerShell 창 / 명령 프롬프트에서 현재 값을 복사 / 저장합니다 reg.exe add <path-to-value> /ve /t REG_EXPAND_SZ /d "<value>". 빌라, 당신 (Default)열쇠는 이제 REG_EXPAND_SZ!
Ian Kemp

1
@IanKemp은 따옴표를 쓰는 것을 잊지 않고 "<path-to-value>"각괄호가 값의 일부가 아니라는 것을 기억해야합니다
smac89

1

% ProgramFiles (x86) %가 이름에 공백으로 확장되므로 경로를 따옴표로 묶어야한다는 것을 잊지 마십시오. "% ProgramFiles (x86) % \ Feliratozo \ Feliratozo.exe" "% 1"또한 Frank Thomas는 32 비트 Windows에서 작동하지 않는 % ProgramFiles (x86) %에 대해 정확합니다.

변수는 부모 프로세스를 기반으로 확장됩니다. 32 비트 콘솔 또는 regedit (SysWOW64에 있음)를 사용하는 경우 % ProgramFiles %은 64 비트 설치에서 C : \ Program Files (x86)로 확장됩니다.

간단한 해결책 :

Install.cmd :

IF EXIST %WinDIR%\SysWOW64\regedit.exe (
   %WinDIR%\SysWOW64\regedit.exe /s Install.reg
) ELSE (
   %WinDIR%\regedit.exe /s Install.reg
)

Install.reg :

Windows Registry Editor Version 5.00

[...\shell\myThing\command]
@="\"%ProgramFiles%\\Feliratozo\\Feliratozo.exe\" \"%1\""

0

현재 디렉토리 나 마우스 오른쪽 버튼으로 클릭 한 파일의 경로가 필요한 경우 익스플로러 바로 가기 명령에 다음 명령 줄 변수를 사용할 수 있습니다. https://superuser.com/a/473602/ 231129


-1

확장 가능한 문자열 사용

DWORD = dword : 확장 가능 문자열 = 16 진수 (2) : 다중 문자열 = 16 진수 (7) :

DWORD는 부호없는 32 비트 정수입니다 (범위 : 0 ~ 4294967295 10 진수) 레지스트리에서 DWORD는 항상 0x로 시작합니다. 레지스트리에서 DWORDS는 항상 0x 뒤에 오는 8 자리 숫자를가집니다. 10 진수 또는 16 진수 형식 일 수 있으며, 1000은 다음과 같이 작성할 수 있습니다. 0x00001000 또는 0x000003e8

DWORDS는 숫자 0-9 만 사용할 수 있습니다. 모든 종류의 문자열은 항상 ASCII를 사용하며 ACSII 1000은 31,30,30,30으로만 작성할 수 있습니다. String 데이터 유형의 경우 ASCII는 사용자가 모르게 백그라운드에서 작동합니다. 컴퓨터가 1과 0 만 이해하기 때문에해야만합니다. 확장 가능한 문자열 및 다중 문자열 데이터 형식의 경우 항목을 쉼표 및 16 진수로 구분하여 16 진수 형식의 ASCII 코드로 저장합니다. 따라서 1000의 확장 가능 문자열은 다음과 같습니다. hex (2) : 31,00,30,00,30,00,30,00

이제 % PROGRAMFILES %를 확장 가능한 문자열로 변환 해 봅시다. 먼저 다운로드 : https://hotfile.com/dl/244097278/55aa086/ASCII_2_HEX_Conversion_Tool.7z.html

현대적인 브라우저에서 열어보십시오. % PROGRAMFILES %를 ASCII 상자에 입력하고 인코딩을 선택하십시오. 텍스트 편집기에 붙여 넣기를 복사하여 첫 번째 %를 끝까지 옮깁니다. 25 % 50 % 52 % 4F % 47 % 52 % 41 % 4D % 46 % 49 % 4C % 45 % 53 % 25 바꾸기 명령을 선택하고 모든 "%"를 찾아 ", 00"으로 바꿉니다. 맨 마지막에 쉼표를 제거하십시오. 다음과 같이 표시됩니다. 25,00,50,00,52,00,4F, 00,47,00,52,00,41,00,4D, 00,46,00,49,00,4C, 00,45, 00,53,00,25,00 마지막으로 hex (2) : 25,00,50,00,52,00,4F, 00,47,00,52,00,41,00,4D, 00,46 , 00,49,00,4C, 00,45,00,53,00,25,00

끝난.

호기심이 많은 16 진수 레지스트리 항목을 ASCII로 변환하려고 시도한 적이 있으며 비참하게 실패했습니다. 이 단원에서는 암호화되지 않은 16 진수 코드 레지스트리 항목을 리버스 엔지니어링하는 데 필요한 모든 지식을 제공합니다. 재미있게 보내십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.