.vbs对用户收藏夹列表进行排序

时间:2011-04-12 00:08:00

标签: vbscript

此脚本的总体目标: 发送给员工并为每台笔记本电脑添加一组收藏夹(Web文件夹)。到目前为止,我已经编写(采购并改编)了一个脚本,将所有文件夹添加到收藏夹中,但最后会在收藏夹列表中输入。

我正在寻找一种按日期排序收藏列表的方法,甚至更好地将文件夹插入列表顶部,这样就不会改变当前用户收藏夹的顺序。

这是我到目前为止,链接无法正常工作,因为它们在我们的内部网上

'Create Network Folder*******************************************  


Option Explicit  
MsgBox("Click OK to begin installing all of the Web Folders under My Network Places.")


Sub CreateNetworkFolder(siteURL, siteName)  

Dim iRes, jRes, MT, TT  
Dim SH, newPath  
Dim objFso, f, fs, g  

Dim bString  
Dim ltrIndex  
Dim nameLength, urlLength, urlCutoff  
Dim aFile  
Dim filesys

'ForWriting (2) is the attribute to be set when writing to a file.  
Const ForWriting = 2  

nameLength = Len(siteName)  
urlLength = Len(siteURL)  
'44 seems to be the length where we have to change a 00 to a 01.  
urlCutoff = 44  

Set objFso = CreateObject("Scripting.FileSystemObject")  

Set SH = WScript.CreateObject("WScript.Shell")  

'Create the folder under Favorites that will hold the target.lnk file  
newPath = SH.SpecialFolders("Favorites") & "\" & "BCKM" & "\"  

'Creating the housing folder for BCKM
Set filesys = CreateObject("Scripting.FileSystemObject")

If filesys.FolderExists(newPath) Then
   'msgbox "File esists"
  else
   'msgbox "file does not exist"
   objFso.CreateFolder(newPath) 
End If



'Create the webfolder for each section
newPath = SH.SpecialFolders("Favorites") & "\" & "BCKM" & "\" & siteName 
objFso.CreateFolder(newPath) 

'We ceate a Desktop.ini file  
Set fs = CreateObject("Scripting.FileSystemObject")  
aFile = newPath & "\Desktop.ini"  

Set f = fs.OpenTextFile( aFile, ForWriting, True )  

'Write the data lines that will make this a folder shortcut.  
f.WriteLine "[.ShellClassInfo]"  
f.WriteLine "CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}"  
f.WriteLine "Flags=2"  
f.WriteLine "ConfirmFileOp=0" 



f.Close  

'We make Desktop.ini a system-hidden file by assigning it attribute of 6  
Set fs = CreateObject("Scripting.FileSystemObject")  
Set g = fs.GetFile(newPath & "\Desktop.ini")  
g.Attributes = 6  

'We make the folder read-only by assigning it 1.  
Set fs = CreateObject("Scripting.FileSystemObject")  
Set g = fs.GetFolder(newPath)  
g.Attributes = 1  

'This is where we construct the target.lnk file byte by byte. Most of  
'the lines are shown in 16 byte chunks,  
'mostly because that is the way I saw it in the Debug utility I was  
'using to inspect shortcut files.  

'Line 1, 16 bytes  
bString = Chr(&H4C) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H01) & Chr(&H14) & Chr(&H02) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&HC0) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'Line 2, 16 bytes  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H46) & Chr(&H81) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'Line 3, 16 bytes  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'Line 4., 16 bytes. 13th byte is significant.  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H01) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'Line 5. 13th byte is significant.  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'When I was analyzing the next byte of shortcuts I created, I found  
'that it is set to various values,  
'and I have no idea what they are referring to. In desperation I tried  
'substituting some values.  
'00 caused a crash of Explorer. FF seeems to work fine for all.  
'If anyone can get back to me on what this byte is or why FF works,  
'please contact me.  
bString = bString & Chr(&HFF)  

'This byte is 00 if the URL is 44 characters or less, 01 if greater.  
If urlLength > urlCutoff Then  
bString = bString & Chr(&H01)  
Else  
bString = bString & Chr(&H00)  
End If  

bString = bString & Chr(&H14) & Chr(&H00)  

'Line 6, 16 bytes  
bString = bString & Chr(&H1F) & Chr(&H50) & Chr(&HE0) & Chr(&H4F) & Chr(&HD0) & Chr(&H20) & Chr(&HEA) & Chr(&H3A) & Chr(&H69) & Chr(&H10) & Chr(&HA2) & Chr(&HD8) & Chr(&H08) & Chr(&H00) & Chr(&H2B) & Chr(&H30)  

'Line 7, 16 bytes  
bString = bString & Chr(&H30) & Chr(&H9D) & Chr(&H14) & Chr(&H00) & Chr(&H2E) & Chr(&H00) & Chr(&H00) & Chr(&HDF) & Chr(&HEA) & Chr(&HBD) & Chr(&H65) & Chr(&HC2) & Chr(&HD0) & Chr(&H11) & Chr(&HBC) & Chr(&HED)  

'Line 8, 16 bytes  
bString = bString & Chr(&H00) & Chr(&HA0) & Chr(&HC9) & Chr(&H0A) & Chr(&HB5) & Chr(&H0F) & Chr(&HA4)  

'This byte is 00 if the URL is 44 characters or less, 01 if greater.  
If urlLength > urlCutoff Then  
bString = bString & Chr(&H01)  
Else  
bString = bString & Chr(&H00)  
End If  

bString = bString & Chr(&H4C) & Chr(&H50) & Chr(&H00) & Chr(&H01) & Chr(&H42) & Chr(&H57) & Chr(&H00) & Chr(&H00)  

'Line 9, 16 bytes  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H10) & Chr(&H00)  

'Line 10, 2 bytes  
bString = bString & Chr(&H00) & Chr(&H00)  

'The next byte represents the length of the site name.  
bString = bString & Chr(nameLength)  

'Take the site name, and write each letter, preceeded by a "00"  
'character.  

For ltrIndex = 1 to nameLength  
bString = bString & Chr(&H00) & Mid(siteName, ltrIndex, 1)  
Next  

'Middle line, separates the Folder Name from the URL. 3 bytes.  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'The next byte represents the length of the site URL.  
bString = bString & Chr(urlLength)  

'Take the site URL, and write each letter, preceeded by a "00"  
'character.  
For ltrIndex = 1 to urlLength  
bString = bString & Chr(&H00) & Mid(siteURL, ltrIndex, 1)  
Next  

'Last line, 13 bytes  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'Let's create the target.lnk file.  
Set fs = CreateObject("Scripting.FileSystemObject")  
aFile = newPath & "\target.lnk"  
'aFile = newPath & "\vb.sss"  
Set f = fs.OpenTextFile(aFile, ForWriting, True)  
f.Write bString  
f.Close  

End Sub  

'This is where you specify the folders to add

CreateNetworkFolder "http://collaboration.au.xxx.com/dav/1.11.685732/", "Clients" 
CreateNetworkFolder "http://collaboration.au.xxx.com/dav/1.11.685930/", "Workspaces" 
CreateNetworkFolder "http://collaboration.au.xxx.com/dav/1.11.685941/", "Practice Management" 
CreateNetworkFolder "http://collaboration.au.xxx.com/dav/1.11.685945/", "Tips" 
CreateNetworkFolder "http://collaboration.au.xxx.com/dav/1.21.8015/", "Discussion Board" 


MsgBox("All Web Folders Added Succesfully. Please check Favorites to Confirm. Press OK") 

2 个答案:

答案 0 :(得分:2)

为了跟进Helen的回答,注册表项中的“未记录的数据”是相对PCUITEMID_CHILD(参见MSDN)的二进制形式 - 相对于.lnk文件存储在磁盘上的文件夹。这需要使用可以访问COM接口的语言,例如C ++。

注册表项具有文章中记录的标题 - 但是,记录只是记录的长度(DWORD),'order'值(DWORD)和PCUITEMID_CHILD数据。

typedef struct _FAV_ORDERED_HEADER_
{
    DWORD dwFormatValue;    // Typically 8 for known Windows versions that use this
    DWORD dwSubFormatValue; // Typically 2 for known Windows that use this
    DWORD dwTotalDataLen;   // Total bytes in all data
    DWORD dwReserved;       // No known use
    DWORD dwNumRecords;     // Number of records
} FAV_ORDERED_HEADER;

typedef struct _FAV_ORDERED_RECORD_
{
    DWORD dwLenRecord;       // Length of each record (skip this bytes to get next record)
    DWORD dwOrderValue;      // Negative if not ordered (add to end), positive if on list first
    ITEMIDLIST pidlLinkData; // PIDL data for the individiual link - need to use a PIDL compare to be able to compare to actual .lnk file links.
} FAV_ORDERED_RECORD;
  1. 首先使用SHGetFolderLocation(NULL,CSIDL_FAVORITES,NULL,NULL和& ppidlFavorites)获取收藏夹文件夹的PIDLIST_ABSOLUTE。

  2. 通过SHGetDesktopFolder()获取桌面IShellFolder接口指针

  3. 使用IShellFolder实例通过IShellFolder :: BindToObject(ppidlFavorites,NULL,IID_IShellFolder和& pFavoritesShellFolder)访问收藏夹IShellFolder

  4. 使用pFavoritesShellFolder调用IShellFolder :: GetDisplayNameOf()并将数据输入pidl参数 - 并设置要获取的字符串的SHGDNF参数 - 显示名称,URL等通常是通过这种方法获得。

  5. 这适用于shell链接中的Windows 7/8“收藏夹”。但是,它需要使用IKnownFolderManager :: GetFolder(FOLDERID_Links,& pLinksKnFolder)来获取允许最终检索所需IShellFolder的IKnownFolder - 正确获取它的PIDLIST_ABSOLUTE。它的注册表项(用于链接排序)是:

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Modules\CommonPlaces
    

答案 1 :(得分:0)

首先,为什么要以这种奇怪的方式创建快捷方式?通过调用WshShell.CreateShortcut并设置生成的WshShortcut对象的属性,可以更轻松地完成此操作。


现在来看你的排序问题。有两个管理收藏夹状态的注册表项:

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Favorites - 对应于Internet Explorer中显示的收藏夹。
  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Favorites - 对应于Windows开始菜单中显示的收藏夹>收藏夹。

收藏夹的排序顺序存储在这些键的DWORD Order值中。对于收藏夹中的每个文件夹,都有相应的子键,该子键也具有Order值。 Order值的内部结构未记录,但this article提供了一些分析和解释。

因此,要更改排序顺序,您可以尝试从脚本中修改此值,例如,使用WMI StdRegProv.GetDWORDValueStdRegProv.SetDWORDValue方法。但是,我想这会很棘手。

请注意,如果这是一个选项,则从注册表中删除这些上述密钥sort Favorites in alphabetical order