programing

데스크톱으로의 경로에 대한 환경 변수는 무엇입니까?

codeshow 2023. 8. 5. 11:07
반응형

데스크톱으로의 경로에 대한 환경 변수는 무엇입니까?

Windows 배치 파일을 작성하는 중인데 바탕 화면에 무언가를 복사하려고 합니다.이거 쓸 수 있을 것 같아요.

%사용자 프로파일%\바탕 화면\

하지만, 제 생각에는, 그것은 아마도 영어 운영체제에서만 작동할 것입니다.국제화된 버전에서 작동하는 배치 파일에서 이 작업을 수행할 수 있는 방법이 있습니까?

갱신하다

저는 다음 배치 파일을 시도했습니다.

REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop
FOR /F "usebackq tokens=3 skip=4" %%i in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i
FOR /F "usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%

그리고 다음과 같은 출력을 얻었습니다.

S:\>REG 쿼리 "HKCU\Software\Microsoft\"Windows\현재 버전\탐색기\사용자 셸 폴더" /v Desktop
HKEY_CURRENT_USER\소프트웨어\마이크로소프트\Windows\현재 버전\탐색기\사용자 셸 폴더데스크톱 REG_EXPAND_SZ %USERPROFILE%\데스크톱

S:\>/F "usebackq tokens=3 skip=4" %i의 경우('REG QUERY" "HKCU\Software\Microsoft\")Windows\현재 버전\탐색기\사용자 셸 폴더s" /vDesktop') 데스크톱DIR=%i를 설정합니다.
S:\>FOR /F "usebackq delims=" %i in ('ECHO ECHO ON).") 데스크톱 DIR=%i를 설정합니다.
S:\>SET DesktopDIR=DICOM이 켜져 있습니다.

S:\>ECHO ECHO가 켜져 있습니다.
ECHO 켜졌습니다.

파워셸 (VBScript)에서 적절한 API를 사용해야 합니다.
PowerShell 파일:

[Environment]::GetFolderPath("Desktop")

Powershell을 사용하여 무언가를 복사합니다.

Copy-Item $home\*.txt ([Environment]::GetFolderPath("Desktop"))

다음은 데스크톱 경로를 가져오는 VBScript 예제입니다.

dim WSHShell, desktop, pathstring, objFSO
set objFSO=CreateObject("Scripting.FileSystemObject")
Set WSHshell = CreateObject("WScript.Shell")
desktop = WSHShell.SpecialFolders("Desktop")
pathstring = objFSO.GetAbsolutePathName(desktop)
WScript.Echo pathstring

저는 배치 파일과 함께 vbscript를 사용하는 것이 가장 좋은 해결책이라는 것을 알게 되었습니다.

다음은 배치 파일입니다.

@ECHO OFF
FOR /F "usebackq delims=" %%i in (`cscript findDesktop.vbs`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%

다음은 findDesktop.vbs 파일입니다.

set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
wscript.echo(strDesktop)

다른 해결책이 있을 수 있지만 저는 개인적으로 이것이 덜 진부하다고 생각합니다.

저는 이것을 영어 PC와 프랑스어 PC에서 테스트했습니다. 작동하는 것 같습니다(Windows XP).

편집: 승인된 답변을 사용합니다. 기본 위치를 사용하지 않으면 작동하지 않습니다. 예:사용자가 데스크톱을 D:와 같은 다른 드라이브로 이동했습니다.\데스크탑


XP,및 XP, Vista 7을 할 수 ."%UserProfile%\Desktop"

XP-로 됩니다."C:\Documents and Settings\YourName\Desktop"
XPt-BR로 됩니다."C:\Documents and Settings\YourName\Desktop"
7 됩니다. 7 en-US로 확장됩니다."C:\Users\YourName\Desktop"
7 은 Windows 7 pt-BR로 됩니다."C:\Usuarios\YourName\Desktop"

에서는 Desktop 에는 이 수 없습니다.My documents로 눈을 돌리는.Meus Documentos그리고.Local SettingsConfiguracoes locais개인적으로 저는 OS를 투사할 때 이것이 나쁜 것이라고 생각합니다.

사용에 용법사의[Environment]::GetFolderPath("Desktop")이를 위한 공식 Windows API입니다.

그러나 프롬프트에서 대화형으로 작업을 하거나, 단순히 기계에서 작동하는 것을 원할 경우 틸다(~) 문자는 현재 사용자의 홈 폴더를 말합니다.~/desktop사용자의 바탕 화면 폴더입니다.

Windows(윈도우)의 국제 버전에서는 작동하지 않을 뿐만 아니라 사용자가 레지스트리를 편집하여 데스크톱 폴더를 다른 곳에 상주시켰다면 실패할 수 있습니다.할 수 은 다음사쿼있수다습니리파위를 사용합니다.REG명령:

REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop

이를 변수로 전환하려면 다음과 같은 방법을 사용합니다.

FOR /F "usebackq tokens=3 skip=4" %%i in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i
FOR /F "usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%

또한 DOS 명령 프롬프트를 열고 set 명령을 실행할 수 있습니다.

이를 통해 시스템에서 사용할 수 있는 환경 변수를 파악할 수 있습니다.

예: 영어 이외의 Windows(윈도우 7-64비트)를 구체적으로 요청한 경우에는 다음과 같이 독일어 버전의 독일어 버전(Windows 7-64비트):

set > env.txtenv.txt 유형
모든 사용자 프로파일=C:\프로그램 데이터APPDATA=C:\사용자\SOF\AppData\로밍공통 프로그램 파일=C:\프로그램 파일\공통 파일공통 프로그램 파일(x86)=C:\프로그램 파일(x86)\공통 파일공통 프로그램 W6432=C:\프로그램 파일\공통 파일COMPUTERNAME=VMSOFComSpec=C:\Windows\system32\cmd.exeFP_NO_HOST_CHECK=NOHOME 드라이브=C:
HOMEPATH=\Users\SOF로컬 APPDATA=C:\사용자\SOF\AppData\localLOGONSERVER=\\VMSOFNumber_OF_processors=2OS=Windows_NT경로=C:\Windows\system32;C:\Windows;C:\Windows\시스템32\Wbem;C:\Windows\시스템32\Windows PowerShell\v1.0\;C:\프로그램 파일\거북이SVN\bin;C:\프로그램 파일(x86)\CMake 2.8\bin;C:\Program Files (x86)\emacs-22.3\bin;C:\Program Files(x86)\GnuWin32\bin;PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;VBE;.JS;JSE;.WSF;.WSH;.MSC프로세서_아키텍처=NV64PROCESSOR_IDTIFIER=SNV64 패밀리 15 모델 67 스테핑 3, 정품AMD프로세서_레벨=15PROCESSER_REVISION=프로세서3프로그램 데이터=C:\프로그램 데이터Program Files=C:\프로그램 파일프로그램 파일(x86)=C:\프로그램 파일(x86)프로그램 W6432=C:\프로그램 파일프롬프트 = $P$GPSModulePath=C:\Windows\system32\Windows PowerShell\v1.0\모듈\공용=C:\사용자\공용SESSIONNAME= 세션시스템 드라이브=C:
SystemRoot=C:\WindowsTEMP=C:\사용자\SOF\AppData\Local\온도TMP=C:\사용자\SOF\AppData\Local\온도사용자 도메인=VMSOF사용자 이름=SOF사용자 프로필=C:\사용자\SOFVBOX_INSTALL_PATH=C:\프로그램 파일\Sun\VirtualBox\VS90COMNTOOLS=C:\프로그램 파일(x86)\Microsoft Visual Studio 9.0\공통7\도구\windir=C:\Windows

Windows 7에서는 데스크톱 경로를 반환합니다.

/F "usebackq tokens=3" %%i in ('REG QUERY" "HKCU\Software\Microsoft\")의 경우Windows\현재 버전\탐색기\사용자 셸 폴더" /vDesktop') DESETDOKDIR=%%i/F "usebackq delims=" %%i in ('ECHO %DesktopDIR%')의 경우 DESKOPDIR=%%i를 설정합니다.ECHO %Desktop DIR %

사용하려는 경우

[Environment]::GetFolderPath("Desktop")

에서.cmd.exe그렇게 해도 됩니다(이 스레드에서 MS 사용자 Marian Pascalau 덕분).

set dkey=Desktop
set dump=powershell.exe -NoLogo -NonInteractive "Write-Host $([System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::%dkey%))"
for /F %%i in ('%dump%') do set dir=%%i

echo Desktop directory is %dir%

이것은 해결책은 아니지만 다음과 같은 도움이 되기를 바랍니다.이는 zdesktop=%userprofile%\details에도 KEY = %userprofile%\details인 경우를 제외하고는 거의 완료되지 않습니다.내장된 %userprofile%가 번역되지 않아서 그런 것 같습니다.

REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop>z.out
for /f "tokens=3 skip=4" %%t in (z.out) do set zdesktop=%%t
copy myicon %zdesktop%
set zdesktop=
del z.out

따라서 REG 키를 성공적으로 파싱하지만 키에 %var%가 포함되어 있으면 복사 명령 중에 변환되지 않습니다.

비슷한 문제가 있었는데(VBScript 또는 PowerShell은 옵션이 아니었습니다), 이 문서에서 찾은 코드는 저에게 적합하지 않았습니다.OS 버전과 언어 버전에 문제가 있었습니다.몇 가지 실험을 통해 저는 이 솔루션에 도달했습니다.

for /f "usebackq tokens=2,3*" %%A in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Desktop"`) do if %%A==REG_EXPAND_SZ call :reparse set desktopdir=%%B
echo %desktopdir%
goto :EOF

:reparse
%*
goto :EOF

이 코드는 Windows 7(윈도우 7) 및 Windows XP(윈도우 XP)의 영어 및 폴란드 버전에서 사용할 수 있습니다.

:reparse 서브루틴을 사용하면 환경 변수의 확장이 지연될 수 있습니다.

저는 이것이 조금 오래된 게시물이라는 것을 알지만, 이것이 비슷한 상황에 있는 사람들에게 도움이 될 수도 있다고 생각했습니다.원하는 특수 폴더에 대한 정보를 가져오기 위해 빠른 한 줄의 VBScript를 만들었고(오류 검사는 없지만) 다음과 같이 작동합니다.

다음 행을 사용하여 "GetShellFolder.vbs" 파일을 만듭니다.

WScript.Echo WScript.CreateObject("WScript.Shell").SpecialFolders(WScript.Arguments(0))

나는 항상 cscript.exe(32비트 버전)를 내가 실행하는 배치 파일과 동일한 폴더에 복사합니다. 나는 당신이 동일하게 하고 있다고 가정할 것입니다(사용자들이 어떻게든 C를 제거한 상황이 있었습니다:\Windows\system32가 경로를 벗어나거나, cscript.exe를 제거하거나, 감염되었거나, 작동하지 않습니다.)

이제 복사할 파일을 동일한 폴더에 복사하고 다음 행을 사용하여 배치 파일을 만듭니다.

for /f "delims=" %%i in ('^""%~dp0cscript.exe" "%~dp0GetShellFolder.vbs" "Desktop" //nologo^"') DO SET SHELLDIR=%%i
copy /y "%~dp0<file_to_copy>" "%SHELLDIR%\<file_to_copy>"

위의 코드에서 "데스크탑"을 유효한 특수 폴더(즐겨찾기, 시작 메뉴 등)로 바꿀 수 있습니다. 공식 목록은 https://msdn.microsoft.com/en-us/library/0ea7b5xe%28v=vs.84%29.aspx) 에 있습니다. 물론입니다.<file_to_copy>원하는 실제 파일과 함께 저장합니다.이렇게 하면 레지스트리에 액세스하지 않아도 되며(제한된 사용자로 사용할 수 없음) 여러 응용 프로그램에 쉽게 적응할 수 있습니다.

그리고 은."%~dp0"는 스크립트가 호출되는 디렉토리일 뿐입니다.UNC 경로에서도 작동하므로 배치 파일을 사용할 때 매우 휴대성이 뛰어납니다.그러나 그것은 특히 "\"로 끝나 언뜻 보기에 약간 이상하게 보일 수 있습니다.

@Dave Webb의 대답은 아마도 가야 할 길일 것입니다.제가 생각할 수 있는 유일한 것은 CSIDL입니다.

CSIDL_데스크탑 디렉토리

데스크톱에 파일 개체를 물리적으로 저장하는 데 사용되는 파일 시스템 디렉터리입니다(데스크톱 폴더 자체와 혼동해서는 안 됨).일반적인 경로는 C:\Documents and Settings\username\Desktop.

지휘부 사람들과 연락하는 방법을 모르겠어요

OS에서버전
처리 파일

= = QUERY "HKCU합니다.REG 쿼 "HKCU\Software\Microsoft\"\vDesktop\Explor\ /vDesktop
(=" %%_SZ" 찾기)에 desktop=%/f "delimes=(="%getdesk%^"%GIN("%getdesk%^" 찾기)", "" 찾기=%G" 설정합니다.
desktop1=set desktop1=%dll:사용자 프로파일%\=%
"%cd "%userprofile%\%sv1%"
getdesk= 설정
desktop1탕면설정화바1=
desktop = 탕면설정화바=

이 기능은 Windows(윈도우)의 언어 버전과 폴더 위치에 관계없이 작동합니다.또한 폴더 경로에 공백이 있는지 여부도 중요하지 않습니다.

FOR /F "tokens=2*" %%A IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop^|FIND/I "desktop"') DO SET Desktop=%%B
ECHO %Desktop%

윈도우즈 2000(아마도 NT 4.0)의 경우 reg.exe를 %windir% 폴더에 수동으로 복사해야 합니다. 기본적으로 reg.exe를 %windir% 폴더에서 사용할 수 없기 때문입니다.

Windows XP SP2 PT-PT 및 Windows 10b14393 en-US에서 테스트된 레지스트리에서 사용자 데스크톱 및 공용 데스크톱 경로를 가져오는 데 이 코드를 사용하므로 Vista/7/8 및 기타 언어에서 작동할 수 있습니다.

:: get user desktop and public desktop paths
for /f "tokens=* delims= " %%a in ('reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop ^|find /i "REG_"') do set "batch_userdesktop=%%a"
for /f "tokens=* delims= " %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Common Desktop" ^|find /i "REG_"') do set "batch_publicdesktop=%%a"

:: remove everything up to and including "_SZ"
set "batch_userdesktop=%batch_userdesktop:*_sz=%"
set "batch_publicdesktop=%batch_publicdesktop:*_sz=%%

:: remove leading spaces and TABs
:loop
if "%batch_userdesktop:~0,1%"==" " set "batch_userdesktop=%batch_userdesktop:~1%" & goto loop
if "%batch_publicdesktop:~0,1%"==" " set "batch_publicdesktop=%batch_publicdesktop:~1%" & goto loop
if "%batch_userdesktop:~0,1%"=="    " set "batch_userdesktop=%batch_userdesktop:~1%" & goto loop
if "%batch_publicdesktop:~0,1%"=="  " set "batch_publicdesktop=%batch_publicdesktop:~1%" & goto loop

마지막 두 줄에는 "" 안에 TAB가 포함되어 있으며, 일부 텍스트 편집기는 TAB를 누르면 공백이 추가되므로 공백 대신 실제 TAB가 있어야 합니다.

코드에 로컬 활성화 지연 확장이 필요한지 잘 모르겠습니다. SETVARS의 일부입니다.다른 배치에서 호출하는 CMD는 CPU 아키텍처, 계정 언어, 윈도우즈 버전 및 서비스 팩, 사용자/퍼블릭 데스크톱 경로 등과 같은 공통 변수를 설정합니다.

이것이 오래된 주제인 것은 알지만, 파워셸 변수를 사용할 것입니다.

$env:UserProfile 

데스크톱에 액세스하는 데 사용할 수 있는 방법은 다음과 같습니다.

cd $env:UserProfile\desktop

이 기능은 Windows 7(윈도우 7)에서 로컬 및 원격으로 모두 작동합니다.클라이언트 기계가 $home에 가치가 없는 상황을 우연히 만났기 때문에 이것이 유용하기를 바랍니다.

꽤 오래된 주제입니다.하지만 난 내 2센트를 주고 싶어요

"User Shell Folders"가 아닌 기존 스타일의 "Shell Folders"를 찾기 위해 masz86 솔루션으로 약간 수정했으므로 envvar %userprofile%를 확장할 필요가 없습니다.

또한 powershell/vbscript/ 등으로부터의 종속성도 없습니다.

for /f "usebackq tokens=2,3*" %%A in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Desktop"`) do if %%A==REG_SZ  set desktopdir=%%B
echo %desktopdir%

도움이 되길 바랍니다.

TL;DR

%HOMEDRIVE%%HOMEPATH%\Desktop가장 안전한 방법인 것 같습니다.

논의

Windows에는 마운트가 내부적으로 디렉토리에 매핑되는 통합 디렉토리 트리가 없기 때문에 어떤 드라이브가 있는지에 대한 가정은 매우 취약합니다. 그므로러로.%HOMEDRIVE%는 여러분이것을 하기 합니다. ( 변수가 아닌 가 있습니다.)C:\!).

영어 "이나 "같은 " 영어이데탑크스대", "진된화사이등지가름", "▁that▁non▁to▁aliases▁point,es▁all다▁will▁"not별▁for▁names니입칭는가"키▁like리-"를 가리키는 별칭입니다.Desktop이것은 로케일에 관계없이 기본 표준 디렉터리 이름인 것 같습니다(여기 일본, 태국, 이스라엘 및 미국에서는 안전하게 사용합니다).

큰 차이는 다음과 같은 경우에 발생합니다.%UserProfile%사용자의 실제 프로필 기본 디렉토리 또는 바탕 화면 또는 완전히 다른 위치를 가리킵니다.사실 개발자는 제가 은 설정을 인데, 윈도우 개발자는 윈도우 개발자입니다.%HOMEPATH%사용자 자신의 파일을 위한 것이므로 데스크탑/다운로드/사진/등으로 이어지는 디렉터리 루트를 가리킵니다.이것은 만드는 경향이 있습니다.%HOMEDRIVE%%HOMEPATH%\Desktop가장 안전한 방법

는 이명은데경인다니에 데스크톱 합니다.cmd.exe:

powershell "[System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::Desktop)"
FOR /F "tokens=2*" %i IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop ^| findstr "desktop"') DO echo %j

언급URL : https://stackoverflow.com/questions/2000638/whats-the-environment-variable-for-the-path-to-the-desktop

반응형