[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已结帖]探讨一种比较简洁高效的批处理解决方案(求助)

本帖最后由 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-23 21:23 编辑     历史的巧合?!    注册日期和发帖时间居然重合了。这当然是题外话了,还是请论坛内众高手多多关注本帖,热情给予指点和帮助为盼!

TOP

回复 2# angelbd


    您老就是发帖那天注册的好伐...

楼主的表述看着很晕,大致回复下吧

1、举个例子,判断在哪盘的固定路径下存在 a.exe:
  1. @echo off
  2. for %%a in (c d e f g h) do (
  3.   if exist %%a:\abc\abc1000\a.exe(
  4.      echo %%a:\abc\abc1000\a.exe
  5.   )
  6. )
  7. pause
复制代码
2、把文件复制到 开始>程序 菜单(不是创建快捷方式,而是复制原文件)
  1. copy /y 要复制的文件 %APPDATA%\Microsoft\Windows\Start Menu\Programs
复制代码

TOP

回复 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,在这顺便发一下牢骚,我怎么在这个论坛上很是发怵和郁闷,当时注册和如今发帖都很不顺利,对付验证问题,已经摸索到直接输入正确答案而不能在答案栏按回车只需要用鼠标点击其他地方,一般验证会出现绿色对号,但再单击发表或回复就又发生验证答案错误的提示,好好郁闷哟,不知道其他坛友有木有遇到我这种尴尬局面?

TOP

回复 4# angelbd


    目测无误

TOP

本帖最后由 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   这样写有错误么?
天道酬勤、地道酬善、人道酬诚、商道酬信、业道酬精。

TOP

回复 5# CrLf


    真的非常感谢CrLF大大的热心帮助与无私指教。谢谢了。
天道酬勤、地道酬善、人道酬诚、商道酬信、业道酬精。

TOP

回复 6# angelbd


    更像是初学时不了解@echo off和@之前的关系而遗留下来的陋习,尽快改掉吧。

TOP

这里的路径 最好用引号

TOP

回复 4# angelbd


    为了限制广告贴,前几个帖子是需要验证码的,后面就不需要了。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

路径有空格的时候不要忘了加引号
  1. del /a /f  "%userprofile%\start menu\programs\abc"
复制代码

TOP

回复 8# forfiles


   你说的或许有道理,不过单独使用时这样并没有错误啊?我现在困惑的是用在for /if 语句中的正确方式。多谢指点。
天道酬勤、地道酬善、人道酬诚、商道酬信、业道酬精。

TOP

本帖最后由 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
天道酬勤、地道酬善、人道酬诚、商道酬信、业道酬精。

TOP

回复 11# forfiles


    学习了,多谢指教!
天道酬勤、地道酬善、人道酬诚、商道酬信、业道酬精。

TOP

本帖最后由 angelbd 于 2012-9-25 13:25 编辑

回复 9# terse


     多谢指教!

   原来是这样,多谢11# forfiles!
   @del /a /f  ”%userprofile%\start menu\programs\Mab“  >nul
天道酬勤、地道酬善、人道酬诚、商道酬信、业道酬精。

TOP

返回列表