批处理之家's Archiver

namejm 发表于 2009-3-12 18:22

“打开/另存为”对话框位置栏批处理修改器[2009.3.13更新]

当我们使用诸如记事本、word之类的软件菜单栏里的“打开”或“另存为”按钮的时候,系统会弹出一个对话框让大家定位文件路径。为了快速定位到一些常用的位置,微软在对话框的左侧为大家准备了5个常用路径,分别是:我最近的文档、桌面、我的文档、我的电脑、网上邻居。

  按理说,微软的这个设计是比较贴心的。可是,每个用户都有自己独特的操纵习惯,经常打开的路径是千差万别的,而微软并没有在前台界面开放重设这5个路径的功能,需要通过各种各样的工具软件深入注册表内部做调整。目前网上有这个功能的工具软件较为罕见,于是萌发了用批处理做一个调整“打开/另存为”对话框位置栏工具的念头。经过一番摸索,得到了以下代码,发出来共享之。

  这个批处理具有如下功能:

  1、自行指定“打开/另存为”对话框位置栏的路径;
  2、重新调整自行指定路径的顺序

  使用这个批处理调整前后效果对比:
[attach]1018[/attach][attach]1020[/attach]

  支持多种输入方式:
[attach]1019[/attach]

  注意事项:

  1、最多只能修改5个路径;
  2、若系统是XP_SP1或XP_SP2,系统自带的reg.exe在查询中文路径的时候,会出现“吃字”现象,请用附件中的reg.exe替换之,或放在批处理的相同目录下使用;若不知道reg.exe“吃字”是怎么回事,请阅读这篇文章:[b]reg requery查询注册表时中文路径会"吃掉"最后的字符?[/b][url=http://www.cn-dos.net/forum/viewthread.php?tid=22202]http://www.cn-dos.net/forum/viewthread.php?tid=22202[/url]
  3、代码没有做全面的容错检测,请严格按照提示操作,否则,将不能正确修改路径。[code]@echo off

:: Code by namejm 2009.3.12 Modified on 2009.3.13
:: 不支持带感叹号的路径
:: 争取对默认设置的次序进行重排

set TT="打开/另存为"对话框位置栏修改器
title %TT%
mode con lines=25 cols=70
setlocal enabledelayedexpansion
set RegPath=HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\comdlg32

:Main
cls
for /f "delims==" %%i in ('set place 2^>nul') do set "%%i="
set custom=
for /f "skip=4 tokens=1,2*" %%i in ('reg query %RegPath%\Placesbar 2^>nul') do (
    set custom=yes
    set "%%i=%%k"
)

:ShowConfigDefault
title %TT%-默认设置
if not defined custom (
    echo.&echo                     当前使用的是系统默认的设置
    echo  ____________________________________________________________________
    echo.&echo                         位置序号 对应的路径
    echo                    ——————————————
    echo                            1    我最近的文档
    echo                            2    桌面
    echo                            3    我的文档
    echo                            4    我的电脑
    echo                            5    网上邻居
    echo                    ——————————————
    echo                      建议自行设置更合理的位置
    echo.&echo.
    echo.
    echo          退出请按 0                            全新设置请按 1
    echo  ____________________________________________________________________
    echo.
    set choice=
    set /p choice=                      请输入功能代码(0/1):
    if not defined choice (
        goto Main
    ) else (
        if "!choice!"=="0" exit
        if "!choice!"=="1" goto SetNew
    )
    goto ShowConfigDefault
)

:ShowConfigCustom
title %TT%-自定义设置
cls
echo.&echo                     当前使用的是用户自定义设置
echo  ____________________________________________________________________
echo.&echo                         位置序号 对应的路径
echo                  ——————————————————
set num=0
for /f "delims==" %%i in ('set path_ 2^>nul') do set "%%i="
for /f "tokens=1* delims==" %%i in ('set place') do (
    set /a num+=1
    set "path_!num!=%%~j"
    echo                            !num!         "%%~j"
)
echo                  ——————————————————
echo.&echo.&echo.
echo             退出请按 0                      恢复默认设置请 1
echo  ____________________________________________________________________
echo.
echo           调整当前设置的顺序请按 2        重新设置新路径请按 3
echo.
set choice=
set /p choice=                请输入功能代码(0/1/2/3):
if not defined choice (
    goto ShowConfigCustom
) else (
    if "%choice%"=="0" exit
    if "%choice%"=="1" reg delete %RegPath% /f>nul&goto Main
    if "%choice%"=="2" goto SortConfig
    if "%choice%"=="3" goto SetNew
)
goto ShowConfigCustom

:SortConfig
title %TT%-调整顺序
cls
echo.&echo                              自定义位置的顺序
echo  ____________________________________________________________________
echo.&echo                         位置序号 对应的路径
echo                  ——————————————————
for /f "tokens=2* delims=_=" %%i in ('set path_') do (
    set "str=%%j"
    echo                            %%i     "!str!"
)
echo                  ——————————————————
echo.&echo  ____________________________________________________________________
echo.
echo                若要调整自定义位置的当前顺序,请按照以下步骤操作:
echo.&echo                重新排列 1~%num% 这%num%个数字,并以空格分隔
echo.&echo                重排后的数字顺序就是新的路径顺序
echo.
set order=
set /p order=        请依次输入重排后的数字,并以空格分隔(退出请按0):
if not defined order goto SortConfig
if "%order%"=="0" exit
set /a num1=0

:: 需要对形如 c:\ 的路径做特别处理
for %%i in (%order%) do (
    if %%i gtr %num% goto SortConfig
    set /a num2=%%i-1
    call set "var=%%place!num2!%%"
    if "!var:~-1!"=="\" set "var=!var!\"
    set "str!num1!=!var!"
    set /a num1+=1
)

set /a num-=1
reg delete %RegPath%\Placesbar /f>nul
for /l %%i in (0,1,%num%) do (
    reg add %RegPath%\Placesbar /v place%%i /t REG_SZ /d "!str%%i!">nul
)
echo.&pause
goto Main

:SetNew
title %TT%-指定新路径
cls
reg delete %RegPath% /f>nul 2>nul
echo.&echo                          请指定新的路径
echo  ____________________________________________________________________
echo.&echo        注意事项:
echo                ① 不能输入不存在的路径
echo                ② 若只输入盘符,一定要以两条反斜杠结束,
echo            比如:c:\\
echo                ③ 若输入的是路径,结尾部分不能带任何反
echo            斜杠,比如:c:\test
echo                ④ 最多只能输入5条路径
echo        小技巧:① 可以把文件夹直接拖曳到本窗口
echo                ② 输入的内容可以是类标识符(CLSID),
echo            但是需要在类标识符前加双冒号::
echo         ————————————————————————
echo.
set num=0
for /f "delims==" %%i in ('set str 2^>nul') do set "%%i="
for /l %%i in (1,1,5) do (
    set /p str%%i=        请输入第%%i个路径(直接回车将结束输入):
    if defined str%%i (
        set /a num+=1
        set "str%%i=!str%%i:"=!"
    ) else goto ChangePath
)

:ChangePath
echo  ____________________________________________________________________
set num1=0
for /l %%i in (1,1,%num%) do (
    reg add %RegPath%\Placesbar /v place!num1! /t REG_SZ /d "!str%%i!">nul
    set /a num1+=1
)
echo.&pause
goto Main[/code]部分常用类标识符(CLSID):[code]我的电脑 {20D04FE0-3AEA-1069-A2D8-08002B30309D}
我的文档 {450D8FBA-AD25-11D0-98A8-0800361B1103}
打印机 {2227A280-3AEA-1069-A2DE-08002B30309D}
网上邻居 {208D2C60-3AEA-1069-A2D7-08002B30309D}
回收站 {645FF040-5081-101B-9F08-00AA002F954E}
公文包 {85BBD920-42A0-1069-A2E4-08002B30309D}
控制面板 {21EC2020-3AEA-1069-A2DD-08002B30309D}
WEB文件夹{BDEADF00-C265-11D0-BCED-00A0C90AB50F}
历史记录 {FF393560-C2A7-11CF-BFF4-444553540000}
收藏夹 {1A9BA3A0-143A-11CF-8350-444553540000}[/code]

小勇12 发表于 2009-3-12 21:26

下回去研究,谢谢!!!

鹤冲天 发表于 2009-3-12 22:14

支持!!
希望能有更多实用程序发布!!

tireless 发表于 2009-3-12 22:15

◆ 组策略里可以设置 —— 用户配置→管理模板→Windows组件→Windows资源管理器→通用打开文件对话框。

◆ 有个小软件
◆ 输入类标识符,在我这里无效(系统:xp sp2 中文版)。有两个方法添加“我的电脑”等这些,添加下面的英文或里面的 dword 值:
[quote]CommonDocuments (2e), CommonMusic (35), CommonPictures (36) , Desktop (0), MyComputer (11), MyDocuments (5), MyFavorites (6), MyMusic (d), MyNetworkPlaces (), MyPictures (27), Printers (4), ProgramFiles (), Recent (8) ...[/quote]

◆ 运行批处理,我这始终显示:
[quote]       位置序号 对应的路径
——————————————————
   1  ""
   2  ""
   3  ""
   4  ""
   5  ""
——————————————————[/quote]

[[i] 本帖最后由 tireless 于 2009-3-12 22:41 编辑 [/i]]

namejm 发表于 2009-3-12 22:32

  深度那款软件以前用过,还用过其他几款,以前一直没有找到在哪里修改注册码,这两天在网上无意中发现了这方面的资料,于是就动了写批处理的念头。

  组策略里以前也曾经玩过几次,但是需要层层展开,指指点点,进进出出几次之后,就感到太过繁琐而放弃了。

  添加类标识符需要在前面加上连续的两个半角冒号[color=red][b]::[/b][/color] ,忘记说了,马上添加说明。添加dword值的资料也查到了,下一步打算支持这种输入方式。

tireless 发表于 2009-3-12 22:45

回复 5楼 的帖子

使用 [url=http://www.nirsoft.net/utils/reg_file_from_application.html]RegFromApp[/url] 可以很方便地显示出软件对注册表的改动。

namejm 发表于 2009-3-12 22:55

  显示路径为空的原因是:论坛会把Tab键识别为一般空格,代码复制回去后,还要把第一条for中的Tab字符串替换为一个跳格键。已经在顶楼做了更新说明。

Batcher 发表于 2009-3-12 22:56

回复 6楼 的帖子

我一般用RegSnap,呵呵,下次试试你这个。

【分享】
Outlook的“另存为”在注册表的这个地方设置:[code]reg add "HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Options" /v DefaultPath /t REG_SZ /d "C:\Users\%username%\Desktop" /f[/code]Outlook 2016 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Outlook\Options
Outlook 2013 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\15.0\Outlook\Options
Outlook 2010 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\14.0\Outlook\Options
Outlook 2007 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\12.0\Outlook\Options
Outlook 2003 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\11.0\Outlook\Options
参考:[url=https://www.outlook-tips.net/tips/change-outlooks-open-save-attachments-folder/]https://www.outlook-tips.net/tips/change-outlooks-open-save-attachments-folder/[/url]

tireless 发表于 2009-3-12 23:10

回复 8楼 的帖子

RegFromApp 只要选择要跟踪的程序,然后对这个“程序”进行操作,注册表的改动就会即时显示在 RegFromApp 窗口。而 RegSnap 要生成前后注册表的快照,再比较,这等待的过程太痛苦了...

zqz0012005 发表于 2009-3-12 23:36

回复 6楼 的帖子

RegFromApp 倒没用过。一般是用Filemon+Regmon和RegSnap。以后试试。

Batcher 发表于 2009-3-13 09:54

回复 7楼 的帖子

能否尝试在reg query那句中使用其它方法,别用tab呢?

zqz0012005 发表于 2009-3-13 11:28

回复 7楼 的帖子

分隔符是空格或跳格键时无需指定,它们是默认的分隔符集。

论坛把tab转换为8个空格后,可能是由于下面的原因导致楼主的bat出错。

好像是for的一个bug:[color=red]一般来说,多个相同字符会被当作一个字符(它们不是整体作为分隔符,新手往往问到这个问题)。[/color][color=blue]但如果指定连续多个空格,空格将无法作为分隔符。[/color]
补充以前讨论的一个要点:[color=red]如果分隔符集里面含有空格,空格必须放在最后。[/color][code]@echo off
for /f "delims=aa" %%a in ("1a2") do echo %%a
rem 下面的“宽空格”是两个空格(也可以更多)
for /f "delims=  " %%a in ("1 2  3") do echo %%a
for /f "tokens=1,2 delims=aa  " %%a in ("1 2a3  4") do echo %%a.%%b.
pause[/code]难道空格问题是因为上面那个特殊原因造成的?

[[i] 本帖最后由 zqz0012005 于 2009-3-13 12:27 编辑 [/i]]

Batcher 发表于 2009-3-13 11:41

回复 12楼 的帖子

[quote]另外,好像是for的一个bug:一般来说,多个相同字符会被当作一个字符(它们不是整体作为分隔符,新手往往问到这个问题)。
[/quote]
我觉得这个可能不适合称之为bug,因为人家for就是这样设计的,帮助里面也写的很清楚,当用多个字符作为分隔符时,它们之间是or的关系,多个相同字符之间进行or运算,结果自然是一个字符啦^_^

zqz0012005 发表于 2009-3-13 11:42

回复 13楼 的帖子

我说的Bug是:“但如果指定连续多个空格,空格将无法作为分隔符。”

namejm 发表于 2009-3-13 18:05

[quote]原帖由 [i]Batcher[/i] 于 2009-3-13 09:54 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=23373&ptid=3692][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
能否尝试在reg query那句中使用其它方法,别用tab呢? [/quote]
  呵呵,当初考虑问题复杂过头了,只想到不能把路径中的空格丢掉,所以还特意用了Tab键做分隔符。现在已经在顶楼更新了代码,不用再把复制下来的代码进行修改了。

sjminh 发表于 2009-3-13 18:46

太牛逼了,写的很严谨嘛,我还是回去研究代码吧

z8h8a8ng 发表于 2009-3-15 09:38

谢谢达,回去研究研究

a794685135 发表于 2009-3-16 22:45

占个位置收藏了

Batcher 发表于 2009-4-27 12:40

[color=Blue]十六进制[/color]dword值对照表[code]00 - Desktop
01 - Internet Explorer
02 - Start Menu\Programs
03 - My Computer\Control Panel
04 - My Computer\Printers
05 - My Documents
06 - Favorites
07 - Start Menu\Programs\Startup
08 - \Recent
09 - \SendTo
0a - \Recycle Bin
0b - \Start Menu
0c - - logical "My Documents" desktop icon
0d - My Music
0e - My Videos
10 - \Desktop
11 - My Computer
12 - My Network Places
13 - \NetHood
14 - WINDOWS\Fonts
15 - Templates
16 - All Users\Start Menu
17 - All Users\Programs
18 - All Users\Start Menu
19 - All Users\Desktop
1a - \Application Data
1b - \PrintHood
1c - \Local Settings\Application Data 1d - - Nonlocalized startup
1e - - Nonlocalized common startup
1f - Favorites
20 - Temporary Internet Files
21 - Cookies
22 - History
23 - All Users\Application Data
24 - WINDOWS directory
25 - System32 directory
26 - Program files
27 - My Pictures
28 - USERPROFILE
29 - - x86 system directory on RISC
2a - - x86 C:\Program Files on RISC
2b - C:\Program Files\Common
2c - - x86 Program Files\Common on RISC
2d - All Users\Templates
2e - All Users\Documents
2f - All Users\Start Menu\Programs\Administrative Tools
30 - - \Start Menu\Programs\Administrative Tools
31 - Network and Dial-up Connections
35 - All Users\My Music
36 - All Users\My Pictures
37 - All Users\My Video
38 - Resource Directory
39 - Localized Resource Directory
3a - Links to All Users OEM specific apps
3b - USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning [/code]

China 发表于 2009-4-27 12:52

我用PlacesBar Editor,免费软件,界面也很直观:
[img]http://melloware.com/images/pb_windows.png[/img]
[img]http://melloware.com/images/pb_office.png[/img]
官方:[url]http://melloware.com/products/placesbarv1/[/url]

Batcher 发表于 2009-5-8 23:53

按照这个方法修改注册表之后,对Office系列软件不起作用,楼主是否考虑增加对Office的支持呢?
可参考:[url]https://bbs.et8.net/bbs/showthread.php?p=4310367[/url]

linzuolou 发表于 2009-5-24 02:19

dsfsdfsdf

sdfsdfdfdf

pkhss 发表于 2009-8-10 13:26

找了半天的软件,哈哈

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.