标题: [文件操作] [已结帖]探讨一种比较简洁高效的批处理解决方案(求助) [打印本页]
作者: angelbd 时间: 2012-9-23 21:11 标题: [已结帖]探讨一种比较简洁高效的批处理解决方案(求助)
本帖最后由 angelbd 于 2014-11-20 19:47 编辑
有这样一种需求,我想在同一个批处理中实现两个功能,一是在全部磁盘中查找有无某一特定文件,假设为a.exe,其路径一般是固定的,其安装程序默认的安装路径嘛,比如是 x:\abc\abc1000\,其中x为盘符未定,客户可能选择安装到当前几个磁盘分区中的任何一个,我个人认为磁盘分区一般不可能超过8个(含光驱盘符),即c-j(c、d、e、f、g、h、i、j),如果查到在某磁盘分区下有该a.exe,则从当前目录中向该目录是复制几个exe文件,另一个是要对复制到上一步中的其个文件比如b.exe创建到桌面快捷方式比如叫b.url(至少保证这个)和在当前系统登录用户或者干脆对all users的开始-所有程序-软件目录文件夹-程序快捷方式b.url.
由于自己对批处理熟悉和掌握远远不够,对使用 for 和 if 组合非常头痛,只好使用个人的笨办法,那就是不厌其烦地使用语句罗列,我对第一项的解决思路是使用 if exist "x:\abc\abc1000\a.exe" @copy
*.exe "x:\abc\abc1000\" , X取值从C到H,自己只好写上8条该语句,在这种情况下自己还有不解之处,我想本语句实现复制、删除和跳转三功能,所以用 if exist "x:\abc\abc1000\a.exe" @copy
*.exe x:\abc\abc1000\ /y >nul && @del /f /s /q x:\abc\abc1000\bb.exe >nul && goto :ext, 不过这样写好像和我预想的结果完全不同,自己也不能找出错误所在。 对第二个自己则是从网上找一段语句,按照自己实际内容和条件适当修改和调整后,自己试验后也未能达到目的,挺郁闷的,特放到论坛中请前辈高手施予援手,热心指点一下在下为盼,这里先谢谢了,由于自己在论坛上属初来乍到,没有PB币或积分相赠,只好来日用自己的努力和付出为论坛做出贡献了。
附:自己曾经尝试多次未果的语句附上。
1、实现第一个要求:查找目录文件所在磁盘目录并复制,
setlocal enabledelayedexpansion
::打开变量延迟,因为下面在for循环内有自定义变量
for %%i in (c d e f g h) do (
::设置循环遍历所有磁盘
cd /d %%i:\
::逐个进入到每个磁盘
for /f "delims=" %%a in ('dir /a-d/b/s a.exe') do (
::用dir命令列出所有的a.exe文件,并将结果用for循环/f处理
echo %%a
::显示出查到的文件地址----这时不想输出显示
set lug=%%~dpa
::将找到的文件所在的路径赋值到变量lug,后面你可以用他了。
echo y|copy "*.exe" "!lug!" &&goto :ext))
::复制a.exe 到查到文件所在目录,加echo y是为了覆盖目标
个人觉得这段语句效率不太高,实际情况是没必要扫描全部目录,如上所述,目录是相对特定的,区别只是磁盘盘符不同罢了。再有自己想实现静默安装,不想输出任何屏幕显示。在语句前简单加@ 及在语句后定向输出 >nul ,似乎都有问题或报错。
2、为实现第二个目的,创建桌面快捷方式,没考虑做开始-程序上程序快捷方式,未替换成自己的实际路径与文件
@chrome.exe
@cd /d %~dp0
set path=%userprofile%\桌面\ChromePlus\chrome.exe
set topath="%USERPROFILE%\桌面\chrome.url"
echo [InternetShortcut] >> %topath%
echo URL="%path%" >> %topath%
echo IconIndex=0 >> %topath%
echo IconFile=%path% >> %topath%
这段没搞清,必须先执行欲创建快捷方式的该程序才能取得相对路径?如何实现创建开始-程序上的程序快捷方式,自己也找到一段VBS代码,感觉按自己的思路将之整合到一块着实不太轻松,也觉得有些庞大了,真诚希望能够得到论坛中众高手热情帮助和指教为盼!
作者: angelbd 时间: 2012-9-24 16:10
本帖最后由 angelbd 于 2012-9-23 21:23 编辑 历史的巧合?! 注册日期和发帖时间居然重合了。这当然是题外话了,还是请论坛内众高手多多关注本帖,热情给予指点和帮助为盼!
作者: CrLf 时间: 2012-9-24 18:31
回复 2# angelbd
您老就是发帖那天注册的好伐...
楼主的表述看着很晕,大致回复下吧
1、举个例子,判断在哪盘的固定路径下存在 a.exe:- @echo off
- for %%a in (c d e f g h) do (
- if exist %%a:\abc\abc1000\a.exe(
- echo %%a:\abc\abc1000\a.exe
- )
- )
- pause
复制代码
2、把文件复制到 开始>程序 菜单(不是创建快捷方式,而是复制原文件)- copy /y 要复制的文件 %APPDATA%\Microsoft\Windows\Start Menu\Programs
复制代码
作者: angelbd 时间: 2012-9-25 00:29
回复 3# CrLf
确实自己承认,说明问题比较啰嗦,不够清晰简明,难怪有人给自己起绰号“老啰嗦”,不过好在如果和自己的姓连起来就是另外一个意思了,所以自己也不以为忤。题外话,又不小心说了一大通。
谢谢CrLF热心指点,衷心希望继续指教为盼!
第1项已经学会了,确实很精炼,不过第二项我是想 分别创建指定程序的 桌面快捷方式 和 在开始-所有程序 上的快捷方式,不知如何实现,能不用VBS更好,最好简练高效。
另外,
if exist /I "c:\a\abc\a.exe" @copy *.exe c:\a\abc /y >nul && @del /f /s /q c:\a\abc\a.exe >nul && goto shortcut1 这样写对不对啊?貌似自己以前这样写好像成功过,不过没确定把握了。请指教!
BTW,在这顺便发一下牢骚,我怎么在这个论坛上很是发怵和郁闷,当时注册和如今发帖都很不顺利,对付验证问题,已经摸索到直接输入正确答案而不能在答案栏按回车只需要用鼠标点击其他地方,一般验证会出现绿色对号,但再单击发表或回复就又发生验证答案错误的提示,好好郁闷哟,不知道其他坛友有木有遇到我这种尴尬局面?
作者: CrLf 时间: 2012-9-25 01:16
回复 4# angelbd
目测无误
作者: angelbd 时间: 2012-9-25 09:47
本帖最后由 angelbd 于 2012-9-25 09:51 编辑
弱弱地问一下,通常是不是在任何情况下在一个指令前加上@都应该是没有错吧?由于习惯问题,我经常这样用,比如 @ pause >nul, @copy *.* d:\abc /y >nul,@del /f /q *.exe >nul ,我这样是不是有点“非显示”强迫症了?
另 @del /a /f %userprofile%\start menu\programs\abc >nul 这样写有错误么?
作者: angelbd 时间: 2012-9-25 09:53
回复 5# CrLf
真的非常感谢CrLF大大的热心帮助与无私指教。谢谢了。
作者: forfiles 时间: 2012-9-25 09:59
回复 6# angelbd
更像是初学时不了解@echo off和@之前的关系而遗留下来的陋习,尽快改掉吧。
作者: terse 时间: 2012-9-25 09:59
这里的路径 最好用引号
作者: Batcher 时间: 2012-9-25 10:21
回复 4# angelbd
为了限制广告贴,前几个帖子是需要验证码的,后面就不需要了。
作者: forfiles 时间: 2012-9-25 10:23
路径有空格的时候不要忘了加引号- del /a /f "%userprofile%\start menu\programs\abc"
复制代码
作者: angelbd 时间: 2012-9-25 12:58
回复 8# forfiles
你说的或许有道理,不过单独使用时这样并没有错误啊?我现在困惑的是用在for /if 语句中的正确方式。多谢指点。
作者: angelbd 时间: 2012-9-25 13:00
本帖最后由 angelbd 于 2012-9-25 13:25 编辑
回复 9# terse
可以如此么?
@del /a /f %userprofile%“\start menu\programs\Mab“ >nul ?!
原来是这样,多谢11# forfiles指点!
@del /a /f ”%userprofile%\start menu\programs\Mab“ >nul
作者: angelbd 时间: 2012-9-25 13:10
回复 11# forfiles
学习了,多谢指教!
作者: angelbd 时间: 2012-9-25 13:13
本帖最后由 angelbd 于 2012-9-25 13:25 编辑
回复 9# terse
多谢指教!
原来是这样,多谢11# forfiles!
@del /a /f ”%userprofile%\start menu\programs\Mab“ >nul
作者: angelbd 时间: 2012-9-25 13:17
回复 10# Batcher
谢谢管理员指点开迷津与困惑,真有点好事多磨、苦尽甘来之喜悦!
作者: angelbd 时间: 2012-9-25 13:33
问题又来了,见下面代码:
@cd /d %~dp0
set path=%userprofile%\桌面\Mab\M.exe ::
set topath="%USERPROFILE%\桌面\M.url" :: M.url 与M.lnk之区别 是网页和程序的快捷方式吧?
echo [InternetShortcut] >> %topath%
echo URL="%path%" >> %topath%
echo IconIndex=0 >> %topath%
echo IconFile=%path% >> %topath%
上面的应该可以实现创建桌面快捷方式,不过
想在 开始-所有程序中创建用户自己的程序文件夹,并创建指定路径下的程序快捷方式,如何实现?
作者: wskwfkbdn 时间: 2012-9-26 20:20
回复 1# angelbd
是绿色软件就写个绿化,想安装,就封装个exe安装包,,干嘛搞那么复杂
作者: angelbd 时间: 2012-9-27 17:55
回复 18# wskwfkbdn
和LZ说的情况均不相似,就算是一种升级吧
作者: angelbd 时间: 2012-9-29 18:23
群内各位高手,在下的问题还没有完全解决啊,还请大家继续关注本帖啊
作者: angelbd 时间: 2012-10-5 10:45
怎么,群内高手们都视而不见,见死不救啊?!
作者: ht河豚 时间: 2012-10-5 12:27
学习了,不过为啥发表回复在快速回复模式会这样啊如图
作者: ht河豚 时间: 2012-10-5 12:29
学习了,不过为啥发表回复在快速回复模式会这样啊[attach]5716[/attach]如图,高级模式就不会...,有木有坛友也这样...,
呵,为了截图第一次发出去了???
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |