Re pillow:
抱歉,直到你提出问题,我才发现原来你导出的注册表文件中含有多个"Start Menu"字符串,可见你使用的应该是英文的系统。解决办法是将我给出的代码段的第二行,即“type shellf.reg | find "Start Menu" > ~tmp.txt”这一行修改为:
findstr /R /C:"^\"Start Menu\"" shellf.reg > ~tmp.txt
findstr是2000/xp/2003下新增的支持正则表达式的字符串搜索工具,上述命令行的功能就是从文件shellf.reg中查找以"Start Menu"打头的行,这样搜索的结果就会只过滤出你需要的那一行内容。
至于path1路径中含有双\\的问题,可以使用set命令中的替换字符串的功能来解决,如下:
set path1=%path1:\\=\%
这样原来的代码就变更为:
regedit /e shellf.reg "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
findstr /R /C:"^\"Start Menu\"" shellf.reg > ~tmp.txt
FOR /F "delims== tokens=1,2*" %%i in (~tmp.txt) do @set path1=%%j
set path1=%path1:\\=\%
:: 现在path1变量中已经包括了Start Menu的值
copy test.bat %path1%
del /f /q shellf.reg
del /f /q ~tmp.txt
关于“FOR /F "delims== tokens=1,2*" ...”的用法,delims==表示以“=”作为分隔符分开目标行,tokens=1,2*中的1(也就是%%i)表示“=”前面的部分,而2*表示“=”后面的部分,也就是用%%j来表示。详细请看for /?的帮助。