UFO ET IT

문서 디렉토리에 대한 시스템 정의 환경 변수가 있습니까?

ufoet 2020. 12. 11. 19:04
반응형

문서 디렉토리에 대한 시스템 정의 환경 변수가 있습니까?


%USERPROFILE%Windows XP (및 Vista 및 Windows 7) 시스템 정의 환경 변수에 대해 알고 있습니다. "내 문서"디렉토리의 위치를 ​​가리키는 시스템 정의 환경 변수가 있습니까? XP에서는 기본적으로 %USERPROFILE%\My Documents이고 Win 7에서는 %USERPROFILE%\Documents. 피할 수 있다면 Powershell 스크립트에서 OS 버전을 테스트 할 필요가 없었습니다.


내 기본 설치 XP 시스템에는 이에 대한 환경 변수가 없습니다. 명령 줄에서 "set"명령 (매개 변수 없음)을 사용하여 모든 변수를 나열 할 수 있습니다. 그래서 아마도 테스트를해야 할 것입니다.

OS 버전을 테스트하지 않으려면 "문서"가 있는지 확인하고 그렇지 않은 경우 "내 문서"를 시도하거나 그 반대의 경우도 가능합니다. 그러나 이것은 s / o가 그의 XP 시스템에 "Documents"폴더를 가질 수 있기 때문에 완벽하지 않습니다.

Btw : 제 시스템은 독일어이므로 폴더 이름은 "Dokumente"입니다. 이를 고려해야 할 수도 있습니다.

해당 폴더의 경로는

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

아래 Personal. 하지만 레지스트리 액세스가 필요합니다.

출처 : Microsoft


powershell의 경우 다음이 작동합니다.

[environment]::getfolderpath("mydocuments")

마법의 줄을 피하고

[Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments)

.NET의 경우 다음 사항이 적용됩니다 (예 : 모든 Windows 응용 프로그램에 적용되지 않음 ).

한 가지 대답이 지적했듯이 내 문서를 가리키는 환경 변수는 없지만 Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).NET 에는 (C #)이 있습니다.

포함하지 않는 C #, 환경 변수 및 내 문서와 저스틴의 대답을 인터넷 검색을 할 때이 문제가되어 있기 때문에 나는이 대답을 추가 해요 코드의 라인을 :)

위에서 언급 한 코드 줄을 사용하는 것이 .NET에서 내 문서에 액세스하는 데 선호되는 방법입니다. :)

C # 사용을 위해이 행을 복사하여 붙여 넣으십시오.

var directoryNameOfMyDocuments = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

C #은 MyDocuments에서 대문자 D가 필요합니다.


내장 환경 변수는 없지만 PowerShell에서 다음을 사용하여 위치를 찾을 수 있습니다.

[Environment]::GetFolderPath("mydocuments")

다음을 사용하여 환경 변수를 분명히 만들 수도 있습니다.

$env:DOCUMENTS = [Environment]::GetFolderPath("mydocuments")

(이전 답변을 반복하기 위해) "My Documents"디렉토리에 대해 기본 제공 (WinXP) 환경 변수가 제공되지 않습니다.

그러나 다음 명령을 사용하여 변수를 설정할 수 있습니다.

Windows 7 / 8.1에서 테스트 :

for /f "tokens=3* delims= " %a ^
in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') ^
do (set mydocuments=%a %b)

또는 (라이너 1 개)

for /f "tokens=3* delims= " %a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set mydocuments=%a %b)

그러면 %mydocuments%변수가 제공됩니다.

C:\>echo mydocuments="%mydocuments%"

mydocuments="C:\pathto\My Documents"

(누군가 XP / Vista를 사용합니까? 그렇다면 이것을 테스트하고 작동하는지 알려줄 수 있습니까?)


입력하는 경우 :

set

명령 프롬프트에서 시스템에 정의 된 모든 환경 변수 목록을 얻을 수 있습니다.

내 문서 (Windows 7 Home Premium)에 정의 된 항목을 보면 내 문서를 가리키는 것은 없습니다.

참고 :

SHGetSpecialFolderPath의 기능은 내 문서 디렉토리의 경로를 얻을 수 있습니다. 또는 .Net 에서 Environment.GetFolderPath 메서드를 사용할 수 있습니다.


C:\Documents and Settings\mrabinovitch>set | grep -i document
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\myuser\Application Data
HOMEPATH=\Documents and Settings\myuser
USERPROFILE=C:\Documents and Settings\myuser

보시다시피 그런 vairable이 없습니다.


레지스트리 , .NETPowerShell을 기반으로 한 답변 외에도 WSHWshSpecialFolders 에서 사용할 수도 있습니다 . 다음 은 방법을 보여주는 자체 포함 된 명령 / 배치 스크립트입니다.

@echo off
call :script > "%temp%\%~n0.js" && cscript //nologo "%temp%\%~n0.js" %*
goto :EOF

:script
echo var specialFolders = WScript.CreateObject('WScript.Shell').SpecialFolders;
echo if (WScript.Arguments.length === 0) {
echo     for (var e = new Enumerator(specialFolders); !e.atEnd(); e.moveNext()) {
echo         WScript.Echo(e.item());
echo     }
echo } else {
echo     for (var e = new Enumerator(WScript.Arguments); !e.atEnd(); e.moveNext()) {
echo         WScript.Echo(specialFolders(e.item()));
echo     }
echo }
goto :EOF

JScript에서 WSH 스크립트를 내보내고 인수로 제공된 특수 폴더 토큰에 대한 하나 이상의 경로를 가져 오는 데 사용합니다. 위의 스크립트를라는 파일로 저장했다고 가정하면 specialf.cmd현재 사용자의 문서 디렉토리 경로를 가져 오는 용도는 다음과 같습니다.

specialf MyDocuments

모든 특수 폴더 토큰을 테스트하는 또 다른 사용 방법은 다음과 같습니다.

specialf ^
  AllUsersDesktop ^
  AllUsersStartMenu ^
  AllUsersPrograms ^
  AllUsersStartup ^
  Desktop ^
  Favorites ^
  Fonts ^
  MyDocuments ^
  NetHood ^
  PrintHood ^
  Programs ^
  Recent ^
  SendTo ^
  StartMenu ^
  Startup ^
  Templates

이것을 사용하여 다음과 같은 환경 변수로 캡처 할 수 있습니다.

for /f "delims=/" %p in ('specialf MyDocuments') do @set MYDOCS=%p

CSIDL / KNOWNFOLDERID 값과 명령 셸 환경 변수의 가용성으로 인해 혼동이 발생할 수 있습니다.


Windows 7 (적어도)의 배치 파일의 경우 Nick G의 솔루션은 사용자 정의 변수 UserDocuments를 설정하기 위해 약간의 조정이 필요합니다.

FOR /F "tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set UserDocuments=%%a)

유일한 차이점은 다음과 같습니다.

  1. delims에 공백 문자를 하나만 사용하십시오.
  2. % a 대신 %% a

선을 보지 않고 결과를 보려면 다음을 사용하십시오.

@FOR /F "tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @(Set UserDocuments=%%a)
@Echo ~~~~~~~~ UserDocuments=%UserDocuments%

감사합니다 Nick G. 귀하의 답변은 저에게 많은 것을 가르쳐주었습니다. 다른 사람에게 도움이되기를 바랍니다.


@NickGrealy 답변 개선 :

  1. reg query 출력
empty_line
reg_key_path
이름 유형 값
  1. 레지스트리 값에서 단어 사이에 임의의 양의 '공백 문자'가있을 수 있으며이 경우 %a %b문자열이 올바르지 않습니다.

따라서 skip=2첫 번째 줄을 건너 뛰는 옵션과 tokens=2*레지스트리 값을 %bvar 에 전달하는 옵션을 사용합니다 .

for /f "skip=2 tokens=2*" %A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "UserDocs=%B"

또는 스크립트 파일의 경우 :

for /f "skip=2 tokens=2*" %%A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do set "UserDocs=%%B"

그러나 레지스트리 값을 고려하면 [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\!Do not use this registry key]

@AtifAziz 답변을 기반으로 :

for /f "tokens=*" %A in ('echo WScript.Echo^(^(new ActiveXObject^("WScript.Shell"^)^).SpecialFolders^("MyDocuments"^)^)^>%TEMP%\getdoc.js ^& cscript /nologo %TEMP%\getdoc.js ^& del /q %TEMP%\getdoc.js') do @set "UserDocs=%A"

Windows에는 문서 환경 변수가 설계 상 존재하지 않습니다. 사용자 지정을 만들어야합니다. 여기 로 가면 됩니다 . 참조해야하는 위치를 참조하려면 MYDOCUMENTS라는 환경 변수를 정의하십시오. 이후에는 % MYDOCUMENTS %에서 참조하는 환경 변수가됩니다.


Win XP, Vista, 8, 8.1 및 10에서 테스트 및 워킹 !!

@echo off
    for /f "skip=2 tokens=2*" %%c in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "docs=%%d" && echo WIN XP - 10
    xcopy "C:\test.txt" "%docs%" /f /y
echo %docs%
pause
EXIT

Windows 배치 파일 (.bat) 또는 Windows 명령 스크립트 (.cmd)

@echo off
ver | find "XP" > nul
    if %ERRORLEVEL% == 0 set Docs=%UserProfile%\My Documents & echo WIN XP
    if %ERRORLEVEL% == 1 set Docs=%UserProfile%\Documents & echo WIN vista - 10

    xcopy  "C:\test.txt"  "%Docs%" /f /y 
pause
EXIT

Windows 배치 파일 (.bat) 또는 Windows 명령 스크립트 (.cmd) 업데이트

@echo off
ver | find "XP" > nul
    if %ERRORLEVEL% == 0 SET DOCS=%USERPROFILE%\My Documents & echo WIN XP
    if %ERRORLEVEL% == 1 FOR /f "tokens=3" %%x IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set docs=%%x) & echo WIN vista - 10

    xcopy "C:\test.txt" "%docs%" /f /y
echo %docs%
pause
EXIT

다음은 Windows를 실행하는 모든 사용자에 대한 사용자 변수의 전체 목록입니다.

The reg query portion of the code will find that value and set it so it can be used immediately and allows the other codes to set it permanently for all users. The ad registry portion of the code will enable it for all users. The setx makes it so you don't have to log off and log back in to be able to use the codes.

The current user variables only applies to the person who installed this code.

@ECHO OFF
ECHO REG ALL USER variables

ECHO all user desktop
for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Desktop"') do @set "ALLDT=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLDT" /t  "REG_SZ"  /d "%ALLDT%" /f
 setx ALLDT "%ALLDT%"

 Echo all user's documents
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Documents"') do @set "ALLDOC=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLDOC" /t  "REG_SZ"  /d "%ALLDOC%" /f
   setx ALLDOC "%ALLDOC%"

 echo all user start menu
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Programs"') do    @set "ALLSM=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLSM" /t  "REG_SZ"  /d "%ALLSM%" /f 
 setx ALLSM "%ALLSM%"

  Echo all users startup
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Startup"') do @set "ALLSMSTU=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLSMSTU" /t  "REG_SZ"  /d "%ALLSMSTU%" /f 
   setx ALLSMSTU "%ALLSMSTU%"

  Echo all users music
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonMusic"') do @set "ALLMU=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLMU" /t  "REG_SZ"  /d "%ALLMU%" /f 
   setx ALLMU "%ALLMU%"

  echo all users pictures
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonPictures"') do @set "ALLPIC=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLPIC" /t  "REG_SZ"  /d "%ALLPIC%" /f 
 setx ALLPIC "%ALLPIC%"

 Echo all users videos
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonVideo"') do @set "ALLVID=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLVID" /t  "REG_SZ"  /d "%ALLVID%" /f
 setx ALLVID "%ALLVID%"

 Echo set cerrent user variables 

 Echo current users desktop
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Desktop"') do @set "myDesktop=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myDesktop" /t  "REG_SZ"  /d "%myDesktop%" /f 
setx myDesktop "%myDesktop%"

 Echo current users documents
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "mydoc=%%d"
 REG ADD "HKEY_CURRENT_USER\Environment"  /v "mydoc" /t  "REG_SZ"  /d "%mydoc%" /f 
   setx mydoc "%mydoc%"

 Echo current user start menu
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Start Menu"') do @set "myStart=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myStart" /t  "REG_SZ"  /d "%myStart%" /f 
   setx myStart "%myStart%"

  Echo current user startup
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Startup"') do @set "myStartup=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myStartup" /t  "REG_SZ"  /d "%myStartup%" /f 
   setx myStartup "%myStartup%"

  Echo current users music
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Music"') do @set "myMU=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myMU" /t  "REG_SZ"  /d "%myMU%" /f 
   setx myMU "%myMU%"

 Echo current users pictures
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Pictures"') do @set "myPIC=%%d"
  REG ADD "HKEY_CURRENT_USER\Environment"  /v "myPIC" /t  "REG_SZ"  /d "%myPIC%" /f 
  setx myPIC "%myPIC%"

 Echo current users video
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Video"') do @set "myVID=%%d"
 REG ADD "HKEY_CURRENT_USER\Environment"  /v "myVID" /t  "REG_SZ"  /d    "%myVID%" /f
   setx myVID "%myVID%"

 exit

Actually, the %USERPROFILE%\My Documents should work in Windows 7. It's what I use.

참고URL : https://stackoverflow.com/questions/3492920/is-there-a-system-defined-environment-variable-for-documents-directory

반응형