Board logo

标题: [其他] 求bat脚本可以获取某软件安装根目录 [打印本页]

作者: jack2023    时间: 2023-5-15 18:29     标题: 求bat脚本可以获取某软件安装根目录

本帖最后由 jack2023 于 2023-5-16 17:46 编辑

求高手写一个bat  要求获取改成通用的软件的根目录,并在后面对这个目录进行相关复制、剪切等操作,如何引用这个获取的目录?
例如:
可以获取某软件(比如QQ)的安装根目录,并在其根目录下面新建1个文件夹123。自己网上整合了1个,发现无法识别目录,求高手指教修改一下哈。
  1. @echo off&cd /d "%~dp0"
  2. :: 获取xxx安装目录
  3. set "reg=HKEY_LOCAL_MACHINE\SOFTWARE\QQ"
  4. :: 获取QQ安装目录
  5. for /f "skip=2 tokens=3,*" %%i in ('reg query %reg% /s') do (
  6.     set destPath=%%i %%j
  7.     :: 验证是否是目录
  8.     echo %%i | findstr : >nul && (
  9.         goto back
  10.     )
  11. )
  12. :back
  13. echo %destPath%
  14. md "%destPath%\123\"
  15. pause
  16. exit
复制代码
比如,从桌面QQ快捷方式获取的文件位置为
    "D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe"
则根目录为   D:\Program Files (x86)\Tencent\QQ\Bin\
然后写代码在这个根目录下面新建1个文件名为123的文件夹。
作者: Batcher    时间: 2023-5-15 22:46

回复 1# jack2023


自动获取QQ路径的几种方法:读注册表、全盘搜索、获取进程信息等
http://bbs.bathome.net/thread-4193-1-1.html

试试哪一种在你电脑上能成功?
作者: jack2023    时间: 2023-5-16 09:39

回复 2# Batcher 我的意思并不是要获取QQ的安装目录,qq只是举个例子,换成其他软件也能通用,重要的是后面要对这个安装目录获取的目录进行其他复制、剪切等其他操作。
作者: czjt1234    时间: 2023-5-16 12:05

换成其他软件也能通用

那么,你这个其它软件的名称是从何而来?
桌面上的图标?

还是枚举本机所有的安装程序?
作者: jack2023    时间: 2023-5-16 13:02

回复 4# czjt1234

直接从注册表读取呀,比如软件名称叫autocad2014,或者从桌面读取快捷方式也行?
set "reg=HKEY_LOCAL_MACHINE\SOFTWARE\QQ"
:: 获取QQ安装目录
作者: czjt1234    时间: 2023-5-16 13:22

直接从注册表读取,那怎么知道是 autocad2014 而不是 autocad2015 ?
那就是要读取当前电脑所有的安装程序了?

如果是桌面图标的话,直接就可以读取,不需要到注册表去读
图标右击属性就有,可以直接读取
作者: jack2023    时间: 2023-5-16 13:24

回复 6# czjt1234


    写这个bat  就是方便通用  后面对目录进行bat一键操作    因为在不同电脑软件安装目录不同,直接右键就需要每台电脑都去点,就不是我本意了
作者: czjt1234    时间: 2023-5-16 13:29

不是说去每台电脑右击,是说批处理可以自动完成右击读取的工作

可以读取QQ也可以读取autocad2014

我的意思是,你告诉我的这个QQ和autocad2014你是怎么知道的,哪来的?
作者: jack2023    时间: 2023-5-16 14:10

回复 8# czjt1234


    这个是我要操作的软件   就是要写个bat  来读取我指定的软件,比如我今天想把这个代码用在cad2014,明天用在QQ上,我网上搜索一楼的代码的可以用获取读注册表,也可以读取快捷方式呀  ,但是我整合的用不了
作者: jack2023    时间: 2023-5-16 14:11

回复 9# jack2023


    读完这个软件的目录,在对这个目录进行其他复制,删除的操作。
作者: czjt1234    时间: 2023-5-16 15:02

以QQ为例
其注册表根据版本不同是会变的
可能是 HKEY_LOCAL_MACHINE\SOFTWARE\QQ
可能是 HKEY_LOCAL_MACHINE\SOFTWARE\TENCENT\QQ
可能是 HKEY_LOCAL_MACHINE\SOFTWARE\TENCENT\QQ2016
或者是其它

因此通过注册表来读取是不妥的
即使是在添加删除程序里面,名称也会变

所以还是推荐从桌面图标读取,比如把图标拖到批处理上
作者: jack2023    时间: 2023-5-16 15:05

回复 11# czjt1234


    可以从桌面快捷方式,大佬能否帮我写个bat,读出快捷方式的根目录,并对在这个根目录下面新建1个123的文件夹。谢谢!
作者: czjt1234    时间: 2023-5-16 15:28

"D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe"
哪个是根目录?
Tencent
Tencent\QQ
Tencent\QQ\Bin
作者: jack2023    时间: 2023-5-16 16:22

本帖最后由 jack2023 于 2023-5-16 17:30 编辑

回复 13# czjt1234

比如,从桌面QQ快捷方式获取的文件位置为
    "D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe"
则根目录为   D:\Program Files (x86)\Tencent\QQ\Bin\
然后写代码在这个根目录下面新建1个文件名为123的文件夹。
作者: jack2023    时间: 2023-5-16 17:29

回复 13# czjt1234

比如,从桌面QQ快捷方式获取的文件位置为
    "D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe"
则根目录为   D:\Program Files (x86)\Tencent\QQ\Bin\
然后写代码在这个根目录下面新建1个文件名为123的文件夹。
作者: buyiyang    时间: 2023-5-16 19:07

  1. @echo off
  2. set /p scfile=
  3. set scfile=%scfile:\=\\%
  4. set scfile=%scfile:"=%
  5. for /f "tokens=2 delims==" %%i in ('wmic path win32_shortcutfile where "name='%scfile%'" get target /value') do (
  6. echo,"%%~dpi"
  7. md "%%~dpi123"
  8. )
  9. pause
复制代码

作者: jack2023    时间: 2023-5-16 22:24

本帖最后由 jack2023 于 2023-5-16 22:26 编辑

好像不行呢  大佬 看下哪里填错了
作者: jack2023    时间: 2023-5-16 22:26

回复 16# buyiyang

好像不行呢  大佬 看下哪里填错了

作者: Batcher    时间: 2023-5-16 22:46

回复 18# jack2023


建议以后不要再说“不行”、“一闪而过”、“没有反应”之类的话,因为这对于想要给你进一步帮助的人来说没有任何意义。希望大家都能学会的一个知识点是:如何查看代码的报错信息。

如果你在执行.bat脚本,请参考Q-01观察一下哪行代码在报错以及详细的报错信息:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
作者: terse    时间: 2023-5-17 00:27

这个应该能满足需求
  1. @set @i=0 /* & @echo off&cscript -E:JScript -nologo %0 & pause & exit */
  2. var shell = WScript.CreateObject("WScript.Shell");
  3. var desktopPath = shell.SpecialFolders("Desktop");
  4. var fso = new ActiveXObject("Scripting.FileSystemObject");
  5. var folder = fso.GetFolder(desktopPath);
  6. var files = new Enumerator(folder.Files);
  7. for (; !files.atEnd(); files.moveNext()) {
  8.     var file = files.item();
  9.     if (file.Name.toLowerCase().indexOf(".lnk") == file.Name.length - 4) {
  10.         var ink = shell.CreateShortcut(file.Path);
  11.         var target = ink.TargetPath;
  12.         if (target) {
  13.             var targetfolder = fso.GetParentFolderName(ink.TargetPath);
  14.             WSH.Echo(file.Path, '\n', target, '\n', targetfolder, '\n');
  15.        }
  16.     }
  17. }
复制代码

作者: jack2023    时间: 2023-5-17 09:09

回复 20# terse


    谢谢大佬,这个可以读取桌面的所有快捷方式的名称及路径,我的意思是需要某一个自定义的快捷方式,
比如:搜狗高速浏览器
C:\Users\Administrator\Desktop\搜狗高速浏览器.lnk
D:\Program Files\sougou\SogouExplorer\SogouExplorer.exe
D:\Program Files\sougou\SogouExplorer
比如我需要读取这个的   搜狗高速浏览器.lnk的根目录为 D:\Program Files\sougou\SogouExplorer
并在根目录下面新建1个123的文件夹



麻烦帮忙完善一下代码,谢谢
作者: terse    时间: 2023-5-17 10:38

本帖最后由 terse 于 2023-5-17 12:34 编辑

回复 21# jack2023
把快捷方式图标拖进去处理
  1. @set @i=0 /* & @echo off&cscript -E:JScript -nologo %0 %* & pause & exit */
  2. var ws = new ActiveXObject("WScript.Shell");
  3. var fso = new ActiveXObject("Scripting.FileSystemObject");
  4. for (var i = 0; i < WSH.Arguments.length; i++)
  5. {
  6.       var ink = ws.CreateShortcut(WSH.Arguments(i));
  7.       var folder = fso.GetParentFolderName(ink.TargetPath);
  8.       var newFolder = fso.BuildPath(folder, "new_folder");
  9.       if (!fso.FolderExists(newFolder)) fso.CreateFolder(newFolder);
  10. }
复制代码

作者: czjt1234    时间: 2023-5-17 10:41

回复 22# terse


    估计是要改成支持拖放的比较方便
作者: buyiyang    时间: 2023-5-17 12:06

回复 18# jack2023


    双击执行,拖动快捷方式到窗口,回车。
作者: buyiyang    时间: 2023-5-17 18:54

  1. @echo off
  2. set "scfile=QQ"
  3. for %%i in ("%USERPROFILE%\Desktop\") do set "scp=%%~pi"
  4. if exist %USERPROFILE%\Desktop\*%scfile%*.lnk (
  5. set "scp=%scp:\=\\%"
  6. ) else if exist %PUBLIC%\Desktop\*%scfile%*.lnk (
  7. set "scp=\\users\\public\\desktop\\"
  8. ) else (echo,%scfile% is nonexistent&pause&exit)
  9. set "scfile=%%%scfile%%%"
  10. for /f "tokens=2 delims==" %%i in ('wmic path win32_shortcutfile where "Path='%scp%' and extension='LNK' and FileName like '%scfile%'" get target /value') do (
  11. echo,"%%~dpi"
  12. md "%%~dpi123"
  13. )
  14. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2