xiaojinglf 发表于 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
    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的跳转语法?我看了帮助都找不到类似的命令。
---------------------------------------------------
非常感谢下面各位的解答和帮助。

3mile 发表于 2010-5-2 21:58:40

If Not FileExists($varCD[$i] & "\沐雨庭园软件选择安装器.EXE") Then
这句已经在循环之外,不出错才怪

xiaojinglf 发表于 2010-5-3 12:18:06

If Not FileExists($varCD[$i] & "\沐雨庭园软件选择安装器.EXE") Then
这句已经在循环之外,不出错才怪
3mile 发表于 2010-5-2 21:58 http://www.autoitx.com/images/common/back.gif

当上述条件不满足时,也就是为找到光盘时。自然就会跳出循环到这里了。在这里判断文件是否存在。
我先前是在这里判断进程,都是可以的。而且我换成判断绝对路径的文件就可以正常,说明逻辑是正确的。但换成判断包含变量的文件就不行了。我估计问题在$varCD[$i]这里。

3mile 发表于 2010-5-3 14:41:06

Dim $varCD = DriveGetDrive("CDROM")
If Not @error Then
For $i = 1 To $varCD
    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

shqf 发表于 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]

xiaojinglf 发表于 2010-5-3 22:44:23

FOR语句中的NEXT总会先加上1再和终值判断,当$i>终值时,跳出FOR循环语句,此时$i会比终值大1.所以你的代码 ...
shqf 发表于 2010-5-3 21:45 http://www.autoitx.com/images/common/back.gif

非常感谢解答,学习了。我去试一下。

xiaojinglf 发表于 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 http://www.autoitx.com/images/common/back.gif

改成$i-1后虽然可以正常查询文件。但是。并不能判断文件在正确的光盘中。加入实际光盘在第一个光驱中,而$i-1定义的是最后的一个光盘。因此即使文件复制成功。跳出next后。也强制显示警告。

netegg 发表于 2010-5-3 23:00:14

本帖最后由 netegg 于 2010-5-3 23:02 编辑

没试过,不知道行不行
直接换成For $i In $varCD呢
下面对应的$varCD[$i]改成用$i

xiaojinglf 发表于 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 http://www.autoitx.com/images/common/back.gif

如果改成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

xiaojinglf 发表于 2010-5-4 06:40:19


3mile 发表于 2010-5-3 14:41 http://www.autoitx.com/images/common/back.gif

恩。我试过了。看到了当时的值了。谢谢解答

netegg 发表于 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

xiaojinglf 发表于 2010-5-4 18:19:32

本帖最后由 xiaojinglf 于 2010-5-4 18:23 编辑

回复xiaojinglf

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

Dim $varCD = DriveGetDriv ...
netegg 发表于 2010-5-4 14:29 http://www.autoitx.com/images/common/back.gif

不行。我试过先赋值。如果光盘存在,就么有问题。一旦不存在此光盘。就无任何结果。报变量错误。
如果将此处变量改为 $varD = $i等就可以。但是如果没有光盘。将赋值为最后一个光驱盘符。仍然导致文件不能判断。

xiaojinglf 发表于 2010-5-4 18:49:59

本帖最后由 xiaojinglf 于 2010-5-4 18:53 编辑

回复 5# shqf

改成$i-1后虽然可以正常查询文件。但是。并不能判断文件在正确的光盘中。加入实际光盘在第一个光驱中,而$i-1定义的是最后的一个光盘。因此即使文件复制成功。跳出next后。也强制显示警告。
因此需要在发现正确光盘并进行了复制后立即跳出循环最好。

shqf 发表于 2010-5-4 20:22:20

本帖最后由 shqf 于 2010-5-4 20:32 编辑

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

xiaojinglf 发表于 2010-5-4 21:44:26

这是另外一个问题。其实早就存在了。之前我只是就你先前的疑问进行了说明。是的,现在的问题如想简单点解决 ...
shqf 发表于 2010-5-4 20:22 http://www.autoitx.com/images/common/back.gif

太感谢你的解答了。我自己改了一下。非常好了。Dim $varCD = DriveGetDrive("CDROM")
$flag=false
If Not @error Then
For $i = 1 To $varCD
    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
页: [1] 2
查看完整版本: 关于一个驱动器路径的问题