找回密码
 加入
搜索
查看: 7910|回复: 15

[AU3基础] 关于一个驱动器路径的问题

  [复制链接]
发表于 2010-5-2 20:36:07 | 显示全部楼层 |阅读模式
本帖最后由 xiaojinglf 于 2010-5-6 07:06 编辑

为了备份光驱上的软件安装包。我写了一个脚本。
但是执行中出现一个小问题。希望大家帮助。
脚本如下:
-------------------------------------start---------------------------------------
Dim $varCD = DriveGetDrive("CDROM")
If Not @error Then
For $i = 1 To $varCD[0]
    If StringInStr(DriveGetLabel($varCD[$i]), "沐雨xp") <> 0 Then          ;如果搜寻到光驱卷标中包含“沐雨xp”
        TrayTip ( "提示", "正在复制文件,请稍候……,请勿进行其他操作!", 30, 2)
    DirCopy($varCD[$i] & "\files", "d:\soft\files" , 1 )
    DirCopy($varCD[$i] & "\SORT", "d:\soft\SORT" , 1 )
    FileCopy ($varCD[$i] & "\沐雨庭园软件选择安装器.EXE", "d:\soft\" , 9 )
    FileCopy ($varCD[$i] & "\沐雨庭园软件选择安装器.INI", "d:\soft\" , 9 )
    FileSetAttrib("d:\soft\sort","+H")
    FileSetAttrib("d:\soft\沐雨庭园软件选择安装器.INI","+H")  
        TrayTip ( "提示", "软件已经成功保存在D盘soft文件夹中。", 30, 2)
        Sleep (2000)
   EndIf
Next
    If Not FileExists($varCD[$i] & "\沐雨庭园软件选择安装器.EXE") Then
    MsgBox (4096,"光驱中未发现“沐雨庭园”系列安装盘","如需保存软件到D盘备用,请插入“沐雨庭园”安装光盘后重试”(虚拟光驱加载Iso或者真实光驱均可)!")
    EndIf
EndIf
------------------------------------------end-----------------------------------
前面复制文件一段都正常,证明cdrom盘符变量  $varCD[$i]  这个完全可以正常工作。文件也成功复制完成。
但是。如果我不插入光盘,此时会执行到 If Not FileExists($varCD[$i] & "\沐雨庭园软件选择安装器.EXE") Then这一句。
括号里面的变量  $varCD[$i]  好像无法生效。试运行也显示括号内有错误。不知道什么问题。望高手指导。谢谢。

另外,autoit有没有一个类似bat中的goto的跳转语法?我看了帮助都找不到类似的命令。
---------------------------------------------------
非常感谢下面各位的解答和帮助。
发表于 2010-5-2 21:58:40 | 显示全部楼层
If Not FileExists($varCD[$i] & "\沐雨庭园软件选择安装器.EXE") Then
这句已经在循环之外,不出错才怪
 楼主| 发表于 2010-5-3 12:18:06 | 显示全部楼层
If Not FileExists($varCD[$i] & "\沐雨庭园软件选择安装器.EXE") Then
这句已经在循环之外,不出错才怪
3mile 发表于 2010-5-2 21:58


当上述条件不满足时,也就是为找到光盘时。自然就会跳出循环到这里了。在这里判断文件是否存在。
我先前是在这里判断进程,都是可以的。而且我换成判断绝对路径的文件就可以正常,说明逻辑是正确的。但换成判断包含变量的文件就不行了。我估计问题在$varCD[$i]这里。
发表于 2010-5-3 14:41:06 | 显示全部楼层
Dim $varCD = DriveGetDrive("CDROM")
If Not @error Then
For $i = 1 To $varCD[0]
    If StringInStr(DriveGetLabel($varCD[$i]), "沐雨xp") <> 0 Then          ;如果搜寻到光驱卷标中包含“沐雨xp”
        TrayTip ( "提示", "正在复制文件,请稍候……,请勿进行其他操作!", 30, 2)
    DirCopy($varCD[$i] & "\files", "d:\soft\files" , 1 )
    DirCopy($varCD[$i] & "\SORT", "d:\soft\SORT" , 1 )
    FileCopy ($varCD[$i] & "\沐雨庭园软件选择安装器.EXE", "d:\soft" , 9 )
    FileCopy ($varCD[$i] & "\沐雨庭园软件选择安装器.INI", "d:\soft" , 9 )
    FileSetAttrib("d:\soft\sort","+H")
    FileSetAttrib("d:\soft\沐雨庭园软件选择安装器.INI","+H")  
        TrayTip ( "提示", "软件已经成功保存在D盘soft文件夹中。", 30, 2)
        Sleep (2000)
   EndIf
Next
MsgBox(0,0,"$i="&$i);这里加个中断,自己看
    ;If Not FileExists($varCD[$i] & "\沐雨庭园软件选择安装器.EXE") Then
    ;MsgBox (4096,"光驱中未发现“沐雨庭园”系列安装盘","如需保存软件到D盘备用,请插入“沐雨庭园”安装光盘后重试”(虚拟光驱加载Iso或者真实光驱均可)!")
    ;EndIf
EndIf

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2010-5-3 21:45:55 | 显示全部楼层
本帖最后由 shqf 于 2010-5-3 21:47 编辑

FOR语句中的NEXT总会先加上1再和终值判断,当$i>终值时,跳出FOR循环语句,此时$i会比终值大1.所以你的代码会出错。If Not FileExists($varCD[$i] & "\沐雨庭园软件选择安装器.EXE") Then 语句当中$varCD[$i]应改为$varCD[$i-1]
 楼主| 发表于 2010-5-3 22:44:23 | 显示全部楼层
FOR语句中的NEXT总会先加上1再和终值判断,当$i>终值时,跳出FOR循环语句,此时$i会比终值大1.所以你的代码 ...
shqf 发表于 2010-5-3 21:45


非常感谢解答,学习了。我去试一下。
 楼主| 发表于 2010-5-3 22:44:45 | 显示全部楼层
本帖最后由 xiaojinglf 于 2010-5-4 18:49 编辑
FOR语句中的NEXT总会先加上1再和终值判断,当$i>终值时,跳出FOR循环语句,此时$i会比终值大1.所以你的代码 ...
shqf 发表于 2010-5-3 21:45


改成$i-1后虽然可以正常查询文件。但是。并不能判断文件在正确的光盘中。加入实际光盘在第一个光驱中,而$i-1定义的是最后的一个光盘。因此即使文件复制成功。跳出next后。也强制显示警告。
发表于 2010-5-3 23:00:14 | 显示全部楼层
本帖最后由 netegg 于 2010-5-3 23:02 编辑

没试过,不知道行不行
直接换成For $i In $varCD呢
下面对应的$varCD[$i]改成用$i
 楼主| 发表于 2010-5-4 06:39:19 | 显示全部楼层
本帖最后由 xiaojinglf 于 2010-5-4 06:51 编辑
没试过,不知道行不行
直接换成For $i In $varCD呢
下面对应的$varCD[$i]改成用$i
netegg 发表于 2010-5-3 23:00


如果改成For $i In $varCD。$i变量就以盘符形式出现,next之前都是正确运行的。但后面跳出next后。就不好办了。
因为跳出next后。$i是最后变量值,所以无论前面是否成功。都会在最后一段找不到文件,除非文件真的在最后一个光驱。

另外,autoit有没有一个类似bat中的goto的跳转语法?我看了帮助都找不到类似的命令。我想如果复制成功就直接跳出,免得进行后面的判断。
Dim $varCD = DriveGetDrive("CDROM")
If Not @error Then
For $i In $varCD
    If StringInStr(DriveGetLabel($i), "沐雨庭园") <> 0 Then          ;如果搜寻到光驱卷标中包含“沐雨庭园”[这个必须是光驱中光盘的卷标!]
        TrayTip ( "提示", "正在复制文件,请稍候……,请勿进行其他操作!", 30, 2)
    DirCopy($i & "\files", "d:\soft\files" , 1 )
    DirCopy($i & "\SORT", "d:\soft\SORT" , 1 )
    FileCopy ($i & "\沐雨庭园软件选择安装器.EXE", "d:\soft" , 9 )
    FileCopy ($i & "\沐雨庭园软件选择安装器.INI", "d:\soft" , 9 )
    FileSetAttrib("d:\soft\sort","+H")
    FileSetAttrib("d:\soft\沐雨庭园软件选择安装器.INI","+H")  
        TrayTip ( "提示", "软件已经成功保存在D盘soft文件夹中。", 30, 2)
        Sleep (2000)
    EndIf
Next
;MsgBox(0,0,"$i="&$i);临时
    If Not FileExists($i & "\沐雨庭园软件选择安装器.EXE") Then ;此处的$i不对。
    MsgBox (4096,"光驱中未发现“沐雨庭园”系列安装盘","如需保存软件到D盘备用,请插入“沐雨庭园”安装光盘后重试”(虚拟光驱加载Iso或者真实光驱均可)!")
    EndIf
EndIf
 楼主| 发表于 2010-5-4 06:40:19 | 显示全部楼层
3mile 发表于 2010-5-3 14:41


恩。我试过了。看到了当时的值了。谢谢解答
发表于 2010-5-4 14:29:01 | 显示全部楼层
本帖最后由 netegg 于 2010-5-4 14:35 编辑

回复 9# xiaojinglf

这不是很简单吗,跳出循环之前,赋值给一个变量就行了

Dim $varCD = DriveGetDrive("CDROM")
If Not @error Then
For $i In $varCD
    If StringInStr(DriveGetLabel($i), "沐雨庭园") <> 0 Then          ;如果搜寻到光驱卷标中包含“沐雨庭园”[这个必须是光驱中光盘的卷标!]
        TrayTip ( "提示", "正在复制文件,请稍候……,请勿进行其他操作!", 30, 2)
        DirCopy($i & "\files", "d:\soft\files" , 1 )
        DirCopy($i & "\SORT", "d:\soft\SORT" , 1 )
        FileCopy ($i & "\沐雨庭园软件选择安装器.EXE", "d:\soft\" , 9 )
        FileCopy ($i & "\沐雨庭园软件选择安装器.INI", "d:\soft\" , 9 )
        FileSetAttrib("d:\soft\sort","+H")
        FileSetAttrib("d:\soft\沐雨庭园软件选择安装器.INI","+H")  
        TrayTip ( "提示", "软件已经成功保存在D盘soft文件夹中。", 30, 2)
        $disk = $i
        Sleep (2000)
     EndIf
Next
    ;MsgBox(0,0,"$disk="&$disk);临时
     If Not FileExists($disk & "\沐雨庭园软件选择安装器.EXE") Then ;此处的$i不对。
        MsgBox (4096,"光驱中未发现“沐雨庭园”系列安装盘","如需保存软件到D盘备用,请插入“沐雨庭园”安装光盘后重试”(虚拟光驱加载Iso或者真实光驱均可)!")
     EndIf
  EndIf
 楼主| 发表于 2010-5-4 18:19:32 | 显示全部楼层
本帖最后由 xiaojinglf 于 2010-5-4 18:23 编辑
回复  xiaojinglf

这不是很简单吗,跳出循环之前,赋值给一个变量就行了

Dim $varCD = DriveGetDriv ...
netegg 发表于 2010-5-4 14:29


不行。我试过先赋值。如果光盘存在,就么有问题。一旦不存在此光盘。就无任何结果。报变量错误。
如果将此处变量改为 $varD = $i等就可以。但是如果没有光盘。将赋值为最后一个光驱盘符。仍然导致文件不能判断。
 楼主| 发表于 2010-5-4 18:49:59 | 显示全部楼层
本帖最后由 xiaojinglf 于 2010-5-4 18:53 编辑

回复 5# shqf

改成$i-1后虽然可以正常查询文件。但是。并不能判断文件在正确的光盘中。加入实际光盘在第一个光驱中,而$i-1定义的是最后的一个光盘。因此即使文件复制成功。跳出next后。也强制显示警告。
因此需要在发现正确光盘并进行了复制后立即跳出循环最好。
发表于 2010-5-4 20:22:20 | 显示全部楼层
本帖最后由 shqf 于 2010-5-4 20:32 编辑

这是另外一个问题。其实早就存在了。之前我只是就你先前的疑问进行了说明。是的,现在的问题如想简单点解决的话,只要在循环体内拷贝语句后面加个EXIT就行。如不想就此结束程序的,加个标志就行。如程序一开始设个变量$flag=false,正确拷贝了,就设$flag=ture,并加上exitloop。循环体外,用if 来判断$flag为真还是为否。

评分

参与人数 1金钱 +10 收起 理由
xiaojinglf + 10 感谢解答,学习了

查看全部评分

 楼主| 发表于 2010-5-4 21:44:26 | 显示全部楼层
这是另外一个问题。其实早就存在了。之前我只是就你先前的疑问进行了说明。是的,现在的问题如想简单点解决 ...
shqf 发表于 2010-5-4 20:22


太感谢你的解答了。我自己改了一下。非常好了。
Dim $varCD = DriveGetDrive("CDROM")
$flag=false
If Not @error Then
For $i = 1 To $varCD[0]
    If StringInStr(DriveGetLabel($varCD[$i]), "沐雨庭园") <> 0 Then          ;如果搜寻到光驱卷标中包含“沐雨庭园”[这个必须是光驱中光盘的卷标!]
        TrayTip ( "提示", "正在复制文件,请稍候……,请勿进行其他操作!", 30, 2)
    DirCopy($varCD[$i] & "\files", "d:\soft\files" , 1 )
    DirCopy($varCD[$i] & "\SORT", "d:\soft\SORT" , 1 )
    FileCopy ($varCD[$i] & "\沐雨庭园软件选择安装器.EXE", "d:\soft" , 9 )
    FileCopy ($varCD[$i] & "\沐雨庭园软件选择安装器.INI", "d:\soft" , 9 )
    FileSetAttrib("d:\soft\sort","+H")
    FileSetAttrib("d:\soft\沐雨庭园软件选择安装器.INI","+H")  
        TrayTip ( "提示", "软件已经成功保存在D盘soft文件夹中。", 30, 2)
        Sleep (2000)
        $flag=True
        exitloop
    EndIf
Next
    If $flag=false Then
    MsgBox (4096,"光驱中未发现“沐雨庭园”系列安装盘","如需保存软件到D盘备用,请插入“沐雨庭园”安装光盘后重试”(虚拟光驱加载Iso或者真实光驱均可)!")
    EndIf
EndIf
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-14 03:59 , Processed in 0.095469 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表