代码之家  ›  专栏  ›  技术社区  ›  Onorio Catenacci

文档目录是否有系统定义的环境变量?

  •  56
  • Onorio Catenacci  · 技术社区  · 14 年前

    我知道那件事 %USERPROFILE% %USERPROFILE%\My Documents 在赢7的时候 %USERPROFILE%\Documents

    16 回复  |  直到 11 年前
        1
  •  31
  •   mklement0    8 年前

    在我的默认安装XP系统上,没有环境变量。您可以使用命令行中的“set”命令(无参数)列出所有变量。所以你可能得做个测试。

    如果不想测试操作系统版本,只需检查“文档”是否存在,如果不存在,请尝试“我的文档”,反之亦然。但这并不完美,因为s/o在他的XP机器上可能有一个“文档”文件夹。

    顺便说一句:我的系统是德语,所以文件夹名为“Dokumente”。你可能需要考虑到这一点。

    该文件夹的路径存储在

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

    在下面 Personal . 不过,您需要注册表访问权限。

    资料来源: Microsoft

        2
  •  37
  •   flindeberg    6 年前

    [environment]::getfolderpath("mydocuments")
    

    避免使用魔法弦

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

    全部的

    正如一个答案所指出的,没有指向我的文档的环境变量,但是有 Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) (C#)表示.NET。

    我之所以添加这个答案,是因为这个问题是在谷歌搜索C#、环境变量和我的文档时出现的,而Justin的答案不包含 这个 代码行:)

    使用上述代码行是访问.NET中我的文档的首选方法:)

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

    注意,在MyDocuments中C需要大写D。

        3
  •  24
  •   mikemaccana    6 年前

    [Environment]::GetFolderPath("mydocuments")
    

    显然,您还可以使用以下方法创建环境变量:

    $env:DOCUMENTS = [Environment]::GetFolderPath("mydocuments")
    
        4
  •  15
  •   Nick Grealy    10 年前

    (只是重申前面的答案)没有为“mydocuments”目录提供现成的环境变量(WinXP)。

    但是,可以使用以下命令设置变量:

    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)
    

    或(一个衬垫)

    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"
    

        5
  •  8
  •   Justin    14 年前

    set
    

    在命令提示符中,您将得到系统上定义的所有环境变量的列表。

    看看我的(Windows7家庭高级版)上定义的那些,没有一个指向我的文档。

    仅供参考:

    这个 SHGetSpecialFolderPath Environment.GetFolderPath 方法可以在.Net下使用

        6
  •  5
  •   Moisei    14 年前
    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
    

        7
  •  4
  •   Community CDub    8 年前

    除了基于 registry , .NET PowerShell ,您也可以使用 WshSpecialFolders WSH 自给自足的

    @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
    
        8
  •  3
  •   j0k gauthamp    12 年前

    有些混淆可能是由于CSIDL/KNOWNFOLDERID值与命令shell环境变量的可用性造成的。

        9
  •  3
  •   Rocky Scott    10 年前

    对于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. %%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%
    

    谢谢尼克G。你的回答教会了我很多。我希望这能帮助别人。

        10
  •  2
  •   Dmitry Sokolov    9 年前

    改进@NickGrealy答案:

    1. reg query 输出
    empty_line
    reg_key_path
    name  type  value
    
    1. 在注册表值和 %a %b 在这种情况下字符串不正确

    skip=2 选择跳过第一行和 tokens=2* %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"
    

    或对于脚本文件:

    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]

    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"
    
        11
  •  1
  •   Kara Praveen Prasad    10 年前

    windows中不存在按设计文档的环境变量。你必须创建一个定制的。这样做的方式是 here . 定义一个名为MYDOCUMENTS的环境变量来引用需要引用的位置。此后,它将是一个由%MYDOCUMENTS%引用的环境变量。

        12
  •  1
  •   George H. Compton IV    7 年前

    在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
    
        13
  •  0
  •   neeh    7 年前

    @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
    
        14
  •  0
  •   George H. Compton IV    7 年前

    更新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
    
        15
  •  0
  •   user9150112 user9150112    7 年前

    代码的reg查询部分将找到该值并将其设置为可以立即使用,并允许其他代码为所有用户永久设置该值。 代码的ad注册表部分将为所有用户启用它。setx使您不必注销并重新登录就可以使用这些代码。

    当前用户变量仅适用于安装此代码的人员。

    @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
    
        16
  •  -2
  •   zzlalani M I    11 年前

    事实上 %USERPROFILE%\My Documents