设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 7221|回复: 6
打印 上一主题 下一主题

[API] 【源码】VBA获取系统环境变量及特殊文件夹的各种代码与方法

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2015-4-1 22:25:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这几天帮客户做个系统,需要获到系统环境变量及一些特殊文件夹。收集和研究了各种代码。记录一下,以免自己忘记,同时也分享一下给大家,避免大家遇到同样问题时,再去花费大量时间。

一、我个人整理出来的一些心得和经验:

1.Environ("AllUsersProfile")   在XP下  获取的是   C:\Documents and Settings\All Users
   在win7 win8下获取的是  
   C:\ProgramData
   有所不同,这个差异请注意

2.XP 与win7 大多的变量 是可以对应的,但也有些是对应不到的


环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。


二、常用windows系统环境变量清单

  • %USERPROFILE%           表示     C://Documents and Settings//当前用户名
  • %ALLUSERSPROFILE%   表示     C://Documents and Settings//All Users
  • %APPDATA%                  表示      C://Documents and Settings//当前用户名//Application Data
  • %ALLAPPDATA%            表示      C://Documents and Settings//All Users//Application Data
  • %SYSTEMDRIVE%          表示      C:
  • %HOMEDRIVE%             表示      C://
  • %SYSTEMROOT%           表示      C://WINDOWS
  • %WINDIR%                   表示       C://WINDOWS
  • %TEMP% 和 %TMP%     表示      C://Documents and Settings//当前用户名//Local Settings//Temp
  • %ProgramFiles%           表示      C://Program Files
  • %CommonProgramFiles%     表示    C://Program Files//Common Files

设置环境变量有两种方式:第一种是在命令提示符运行窗口中设置;第二种是通过单击“我的电脑→属性→高级”标签的“环境变量”按钮设置。需要注意的是,第一种设置环境变量的方式只对当前运行窗口有效,关闭运行窗口后,设置就不起作用了,而第二种设置环境变量的方式则是永久有效。
  2.如何在命令提示符窗口中设置环境变量?
  在“开始→运行”框中输入“cmd”后按“确定”按钮,出现命令运行窗口。在命令提示符下输入“set”即可查看环境变量设置。要查看具体某个环境变量的设置,比如要查看path环境变量的设置,可以输入“set path”。要创建一个环境变量,比如要创建一个名为aa的,值为“c:”的环境变量,可以输入“set aa=c:”命令。而要删除一个环境变量,比如要删除aa环境变量,则可输入“set aa=”命令(注意=后面不能有空格)。如何更改一个环境变量的设置呢?更改环境变量有两种情况:一是追加方式,即在不改变环境变量现有设置的情况下,增加变量的值,比如要给环境变量aa增加一个值为“D:”的设置,可以输入“set aa=%path%;D:”。另一种是完全修改方式,对于这种方式,我们可以采用直接创建一个环境变量的方法来实现。
  3.用户变量和系统变量的关系是什么?
  点击“我的电脑→属性→高级”标签的“环境变量”按钮,出现“环境变量”对话框,如果当前是以Administrator登录系统的用户,对话框的上面为Administrator的用户变量,对话框的下面为系统变量(即相当于系统中所有用户的用户变量)。有的时候我们会看到在用户变量和系统变量中都存在某一个环境变量,比如path,那么path的值到底是用户变量中的值还是系统变量中的值,或者两者都不是呢?答案是两者都不是。path变量的值是用户变量中的值与系统变量中的值的叠加。
  4.改变环境变量和环境变量中的值应该注意什么?
  环境变量和环境变量的值不要含有空格,也不要用中文,切记!

     更全的环境变量来一个

   WINDOWS系统
  • %ALLUSERSPROFILE% 局部 返回所有“用户配置文件”的位置。
  • %APPDATA% 局部 返回默认情况下应用程序存储数据的位置。
  • %CD% 局部 返回当前目录字符串。
  • %CMDCMDLINE% 局部 返回用来启动当前的 Cmd.exe 的准确命令行。
  • %CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
  • %COMPUTERNAME% 系统 返回计算机的名称。
  • %COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
  • %DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
  • %ERRORLEVEL% 系统 返回使用过的命令的错误代码。通常用非零值表示错误。
  • %HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  • %HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  • %HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  • %LOGONSEVER% 局部 返回验证当前登录会话的域控制器的名称。
  • %NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
  • %OS% 系统 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT。
  • %PATH% 系统 指定可执行文件的搜索路径。
  • %PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
  • %PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值: x86,IA64。
  • %PROCESSOR_IDENTIFIER% 系统 返回处理器说明。
  • %PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
  • %PROCESSOR_REVISION% 系统 返回处理器修订号的系统变量。
  • %PROMPT% 局部 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
  • %RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
  • %SYSTEMDRIVE% 系统 返回包含 Windows XP 根目录(即系统根目录)的驱动器。
  • %SYSTEMROOT% 系统 返回 Windows XP 根目录的位置。
  • %TEMP% and %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP。
  • %TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关 time 命令的详细信息,请参阅 Time。
  • %USERDOMAIN% 局部 返回包含用户帐户的域的名称。
  • %USERNAME% 局部 返回当前登录的用户的名称。
  • %UserProfile% 局部 返回当前用户的配置文件的位置。
  • %WINDIR% 系统 返回操作系统目录的位置。





三、更详细的VB Environ系统环境变量函数大全(同样支持Access Excel word outlook ppt等 这些VBA环境):


  • Environ ("Windir") 'c:\windows Windows 目录
  • Environ ("ProgramFiles") 'c:\ProgramFiles 应用程序文件夹
  • Environ ("UserProfile") 'C:\Documents and Settings\Administrator 用户配置文件目录
  • Environ ("ALLUSERSPROFILE") '局部 返回所有“用户配置文件”的位置。
  • Environ ("APPDATA") '局部 返回默认情况下应用程序存储数据的位置。
  • Environ ("COMPUTERNAME") '系统 返回计算机的名称。
  • Environ ("COMSPEC") '系统 返回命令行解释器可执行程序的准确路径。
  • Environ ("HOMEDRIVE") '系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  • Environ ("HOMEPATH") '系统 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  • Environ ("NUMBER_OF_PROCESSORS") '系统 指定安装在计算机上的处理器的数目。
  • Environ ("OS") '系统 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT。
  • Environ ("PATH") '系统 指定可执行文件的搜索路径。
  • Environ ("PATHEXT") '系统 返回操作系统认为可执行的文件扩展名的列表。
  • Environ ("PROCESSOR_ARCHITECTURE") '系统 返回处理器的芯片体系结构。值: x86,IA64。
  • Environ ("PROCESSOR_LEVEL") '系统 返回计算机上安装的处理器的型号。
  • Environ ("PROCESSOR_LEVEL") '系统 返回处理器的版本号。
  • Environ ("SYSTEMDRIVE") '系统 返回包含 Windows XP 根目录(即系统根目录)的驱动器。
  • Environ ("SYSTEMROOT") '系统 返回 Windows XP 根目录的位置。
  • Environ ("TEMP") 'and %TMP") '系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP。
  • Environ ("USERDOMAIN") '局部 返回包含用户帐户的域的名称。
  • Environ ("USERNAME") '局部 返回当前登录的用户的名称。




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
 楼主| 发表于 2015-4-1 22:27:33 | 只看该作者
其它相关资料

函数原型:
WINSHELLAPI HRESULT WINAPI SHGetSpecialFolderLocation(
  HWND hwndOwner,
  int nFolder,
  LPITEMIDLIST* ppidl
);

函数功能:
该函数获取一个特殊的文件夹的位置,比如我的电脑,回收站,台式机,打印机,字体,或各种文件系统的目录。

函数参数:
hwndOwner
处理的所有者窗口的客户端应该指定是否显示一个对话框或消息框。

nFolder
值,指定要检索的位置的文件夹。下表列出了可能的值。
它充当应用程序特定数据的公共储存库CSIDL_APPDATA的文件系统目录。
包含在用户的回收站文件对象CSIDL_BITBUCKET的文件系统目录。此目录的位置是不是在注册表中,它被标记为隐藏和系统属性,以防止用户移动或删除它。
CSIDL_CONTROLS不支持。
包含桌面项目CSIDL_DESKTOP虚拟文件夹。这是在虚拟的命名空间的根文件夹。
用于桌面(不要与桌面文件夹本身混淆)上的物理存储文件对象CSIDL_DESKTOPDIRECTORY的文件系统目录。
CSIDL_DRIVES我的电脑,这是一个包含一切的本地计算机上的虚拟文件夹:存储设备和打印机。该文件夹可能还包含映射的网络驱动器。
它充当用户的喜爱项的公共储存库CSIDL_FAVORITES的文件系统目录。
CSIDL_FONTS虚拟包含文件夹的字体。
CSIDL_NETHOOD不支持。
CSIDL_NETWORK网上邻居文件夹,这是代表网络层次结构的顶层虚拟文件夹。
用作文档的公共储存库CSIDL_PERSONAL的文件系统目录。
CSIDL_PRINTERS不支持。
CSIDL_PROFILE文件夹包含用户的个人资料。
CSIDL_PROGRAM_FILES Program Files文件夹。
包含用户程序组(同时亦文件系统目录) CSIDL_PROGRAMS的文件系统目录。
包含用户最近使用过的文档CSIDL_RECENT的文件系统目录。
CSIDL_SENDTO不支持。
包含开始菜单项目CSIDL_STARTMENU的文件系统目录。
对应于用户的启动程序组CSIDL_STARTUP文件系统目录。在系统启动这些程序时,设备上电。
CSIDL_TEMPLATES不支持。
CSIDL_WINDOWS Windows文件夹。

ppidl
指向一个LPITEMIDLIST结构

函数返回:
NOERROR表示成功。一个OLE定义的错误结果表明失败。

易语言声明:
.DLL命令 API_SHGetSpecialFolderLocation, , "shell32.dll", "SHGetSpecialFolderLocation",  
    .参数 hwnd, 整数型, ,
    .参数 csidl, 整数型, ,
    .参数 ppidl, ITEMIDLIST, ,

VB声明:
Declare Sub SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal hwnd As Long, ByVal csidl As Long, ByRef ppidl As ITEMIDLIST)
使用方法:
下面以在VC中使用为例来获取桌面路径,代码如下: 本文来Love代码 www.lvcode.com
LPITEMIDLIST ppidl;
char lpsbuf[255];
SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP   ,&ppidl);
SHGetPathFromIDList(ppidl,lpsbuf);
MessageBox(lpsbuf);

在其它语言中用法类似,由于其它语言需要声明结构就不演示了,按照上面的语法即可获取相应的路径了,路径的说明请看函数的nFolder参数说明!

点击这里给我发消息

3#
 楼主| 发表于 2015-4-1 22:28:57 | 只看该作者
如何用VB获得Windows各类系统目录

现在有很多关于如何用VB获得Windows目录的文章,但大都只讲到如何获得Windows目录和System目录,有时候我们却需要获得像"我的文档"这样的目录("我的文档"的路径并不是固定的,可以由自己设定,也有可能因为系统的安装路径不同而不同),那又该如何处理呢?下面我们来具体谈谈如何用VB获得这种路径。
一、先向大家介绍两个API函数,这两个函数分别是SHGetSpecialFolderLocation和SHGetPathFromIDList      这就是我们用来获得各种路径的武器。
     函数声明:

  1. Private Declare Function SHGetSpecialFolderLocation Lib "Shell32" (ByVal hwndOwner As Long, ByVal nFolder As Integer, ppidl As Long) As Long
  2. Private Declare Function SHGetPathFromIDList Lib "Shell32" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal szPath As String) As Long
复制代码

     函数功能及参数说明:

SHGetSpecialFolderLocation:获得某个特殊目录在特殊目录列表中的位置;它有三个参数,第一个参数是用来指定所有者窗口的,在应用中一般我们写上"0"就可以了;第二个参数是一个整数id,它决定要查找的目录是哪一个目录,它的取值可能如下:

  1. &H0& '桌面
  2. &H2& '程序集
  3. &H5& '我的文档
  4. &H6& '收藏夹
  5. &H7& '启动
  6. &H8& '最近打开的文件
  7. &H9& '发送
  8. &HB& '开始菜单
  9. &H13& '网上邻居
  10. &H14& '字体
  11. &H15& 'ShellNew
  12. &H1A& 'Application Data
  13. &H1B& 'PrintHood
  14. &H20& '网页临时文件
  15. &H21& 'Cookies目录
  16. &H22& '历史
复制代码

第三个参数是获得的特殊目录在特殊目录列表中的地址。

SHGetPathFromIDList:根据某特殊目录在特殊目录列表中的地址获取该目录的准确路径。它有两个参数,第一个参数是特殊目录在特殊目录列表中的地址,也即上一个函数所获得的地址;第二个参数是一个字符串型数据,用来保存返回的特殊目录的准确路径。
比如:为了获得DeskTop的路径,首先需调用SHGetSpecialFolderLocation获得DeskTop在特殊目录列表中的位置Pid,然后调用SHGetPathFromIDList函数获得Pid指向的列表内容,即DeskTop的准确路径。

二、一个用来获取Windows各种目录路径的例子如下:


  1. Private Declare Function SHGetSpecialFolderLocation Lib "Shell32" (ByVal hwndOwner As Long, ByVal nFolder As Integer, ppidl As Long) As Long
  2. Private Declare Function SHGetPathFromIDList Lib "Shell32" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal szPath As String) As Long
  3. Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
  4. Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
  5. Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
  6. Const MAX_LEN = 200 '字符串最大长度
  7. Const DESKTOP = &H0& '桌面
  8. Const PROGRAMS = &H2& '程序集
  9. Const MYDOCUMENTS = &H5& '我的文档
  10. Const MYFAVORITES = &H6& '收藏夹
  11. Const STARTUP = &H7& '启动
  12. Const RECENT = &H8& '最近打开的文件
  13. Const SENDTO = &H9& '发送
  14. Const STARTMENU = &HB& '开始菜单
  15. Const NETHOOD = &H13& '网上邻居
  16. Const FONTS = &H14& '字体
  17. Const SHELLNEW = &H15& 'ShellNew
  18. Const APPDATA = &H1A& 'Application Data
  19. Const PRINTHOOD = &H1B& 'PrintHood
  20. Const PAGETMP = &H20& '网页临时文件
  21. Const COOKIES = &H21& 'Cookies目录
  22. Const HISTORY = &H22& '历史

  23. Private Sub Command2_Click()
  24. End
  25. End Sub

  26. Private Sub Form_Load()
  27. Dim sTmp As String * MAX_LEN '存放结果的固定长度的字符串
  28. Dim nLength As Long '字符串的实际长度
  29. Dim pidl As Long '某特殊目录在特殊目录列表中的位置

  30. '*************************获得Windows目录**********************************
  31. Length = GetWindowsDirectory(sTmp, MAX_LEN)
  32. Debug.Print Left(sTmp, Length)

  33. '*************************获得System目录***********************************
  34. Length = GetSystemDirectory(sTmp, MAX_LEN)
  35. Debug.Print Left(sTmp, Length)

  36. '*************************获得Temp目录***********************************
  37. Length = GetTempPath(MAX_LEN, sTmp)
  38. Debug.Print Left(sTmp, Length)

  39. '*************************获得DeskTop目录**********************************
  40. SHGetSpecialFolderLocation 0, DESKTOP, pidl
  41. SHGetPathFromIDList pidl, sTmp
  42. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  43. '*************************获得发送到目录**********************************
  44. SHGetSpecialFolderLocation 0, SENDTO, pidl
  45. SHGetPathFromIDList pidl, sTmp
  46. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  47. '*************************获得我的文档目录*********************************
  48. SHGetSpecialFolderLocation 0, MYDOCUMENTS, pidl
  49. SHGetPathFromIDList pidl, sTmp
  50. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  51. '*************************获得程序集目录***********************************
  52. SHGetSpecialFolderLocation 0, PROGRAMS, pidl
  53. SHGetPathFromIDList pidl, sTmp
  54. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  55. '*************************获得启动目录*************************************
  56. SHGetSpecialFolderLocation 0, STARTUP, pidl
  57. SHGetPathFromIDList pidl, sTmp
  58. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  59. '*************************获得开始菜单目录*********************************
  60. SHGetSpecialFolderLocation 0, STARTMENU, pidl
  61. SHGetPathFromIDList pidl, sTmp
  62. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  63. '*************************获得收藏夹目录***********************************
  64. SHGetSpecialFolderLocation 0, MYFAVORITES, pidl
  65. SHGetPathFromIDList pidl, sTmp
  66. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  67. '**********************获得最后打开的文件目录*******************************
  68. SHGetSpecialFolderLocation 0, RECENT, pidl
  69. SHGetPathFromIDList pidl, sTmp
  70. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  71. '*************************获得网上邻居目录*********************************
  72. SHGetSpecialFolderLocation 0, NETHOOD, pidl
  73. SHGetPathFromIDList pidl, sTmp
  74. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  75. '*************************获得字体目录**********************************
  76. SHGetSpecialFolderLocation 0, FONTS, pidl
  77. SHGetPathFromIDList pidl, sTmp
  78. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  79. '*************************获得Cookies目录**********************************
  80. SHGetSpecialFolderLocation 0, COOKIES, pidl
  81. SHGetPathFromIDList pidl, sTmp
  82. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  83. '*************************获得历史目录**********************************
  84. SHGetSpecialFolderLocation 0, HISTORY, pidl
  85. SHGetPathFromIDList pidl, sTmp
  86. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  87. '***********************获得网页临时文件目录*******************************
  88. SHGetSpecialFolderLocation 0, PAGETMP, pidl
  89. SHGetPathFromIDList pidl, sTmp
  90. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  91. '*************************获得ShellNew目录*********************************
  92. SHGetSpecialFolderLocation 0, SHELLNEW, pidl
  93. SHGetPathFromIDList pidl, sTmp
  94. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  95. '***********************获得Application Data目录*****************************
  96. SHGetSpecialFolderLocation 0, APPDATA, pidl
  97. SHGetPathFromIDList pidl, sTmp
  98. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  99. '*************************获得PrintHood目录*********************************
  100. SHGetSpecialFolderLocation 0, PRINTHOOD, pidl
  101. SHGetPathFromIDList pidl, sTmp
  102. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)
  103. End Sub
复制代码



4#
发表于 2015-4-1 23:17:34 | 只看该作者
多谢分享哦

点击这里给我发消息

5#
发表于 2015-4-2 04:16:09 来自手机 | 只看该作者
多谢分享 好象Fso里 specialfold也有类似的 但没那么全

点击这里给我发消息

6#
发表于 2015-4-4 17:58:58 | 只看该作者
无私奉献,谢谢分享
7#
发表于 2015-4-7 08:27:31 | 只看该作者
谢谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-29 04:23 , Processed in 0.080840 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表