找回密码
 加入
搜索
查看: 2214|回复: 8

两层FOR嵌套,再加IF不起作用???

  [复制链接]
发表于 2010-2-5 00:30:24 | 显示全部楼层 |阅读模式
本帖最后由 天堂泪吻泪 于 2010-2-5 01:33 编辑

像刚刚http://www.autoitx.com/thread-12836-1-1.html这个贴子一样,通过FileExists来判断这个盘符是否存在,但对软驱和光驱的支持还不够好,所以想做一个两层FOR循环来判断,可循环做到了,但没了判断!!!!!再求大家帮助在下解答下!!!

刚刚才那贴可以说是完美的解决了问题,而且达到了在下想要的效果,详见http://www.autoitx.com/thread-12836-1-1.html四楼!

但是在下还是想知道为什么这个二层循环中的IF会不起任何作用???

一二楼已经完美解决了这些问题了!

在下知道方法的确很多,但在下只是想用自己当前所知道的知识来解决这个问题,有什么不当之处,还请两位大大见谅!!!
#include <array.au3>

$letter=_GetDriverEmptyLetter()
_ArrayDisplay($letter)
Func _GetDriverEmptyLetter()
        Local $AllLetter[1],$Disk=DriveGetDrive("ALL")
        Local $i, $j,$n = 1
        $AllLetter[0] = 0
        For $i = 1 To 26
                        For $j=1 To $Disk[0]
                If Not ($Disk[$j]=Chr(96 + $i) & ":" )Then
                        $n += 1
                        ReDim $AllLetter[$n]
                        $AllLetter[$n - 1] = Chr(96 + $i) & ":"
                                EndIf
                        Next
        Next
        $AllLetter[0] = $n-1
                Return $AllLetter
        ;_ArrayDisplay($AllLetter)
EndFunc   ;==>_GetDriverEmptyLetter

评分

参与人数 1金钱 +10 收起 理由
pusofalse + 10 感谢主动修改帖子分类为[已解决]。

查看全部评分

发表于 2010-2-5 00:57:41 | 显示全部楼层
本帖最后由 pusofalse 于 2010-2-5 01:09 编辑

方法多如牛毛。 - -|||
#include <Array.au3>

$aEmpty = _GetEmptyDrives1()
_Arraydisplay($aEmpty)

$aEmpty = _GetEmptyDrives2()
_Arraydisplay($aEmpty)

$aEmpty = _GetEmptyDrives3()
_Arraydisplay($aEmpty)

$aEmpty = _GetEmptyDrives4()
_Arraydisplay($aEmpty)

$aEmpty = _GetEmptyDrives5()
_Arraydisplay($aEmpty)

#include <WinAPI.au3>
$aEmpty = _GetEmptyDrives6()
_Arraydisplay($aEmpty)

Func _GetEmptyDrives1()
        Local $sDrives, $aDrive, $sResult

        $aDrive = DriveGetDrive("All")
        For $i = 1 To $aDrive[0]
                $sDrives &= $aDrive[$i]
        Next
        For $i = 1 to 26
                $sResult &= Chr(96 + $i)
        Next
        $sResult = StringRegExpReplace($sResult, "[" & $sDrives & "]", "")
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives1

Func _GetEmptyDrives2()
        Local $aDrive, $sDrive, $sResult
        $aDrive = DriveGetDrive("All")
        For $i = 1 To $aDrive[0]
                $sDrive &= $aDrive[$i]
        Next
        For $i = 1 To 26
                If Not StringInStr($sDrive, Chr(96 + $i)) Then
                        $sResult &= Chr(96 + $i)
                EndIf
        Next
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives2

Func _GetEmptyDrives3()
        Local $aDrive, $sDrive, $sResult
        $aDrive = DriveGetDrive("All")
        For $ii = 1 To $aDrive[0]
                Assign($aDrive[$ii], 0)
        Next
        For $ii = 1 To 26
                If Not IsDeclared(Chr(96 + $ii) & ":") Then
                        $sResult &= Chr(96 + $ii)
                EndIf
        Next
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives3

Func _GetEmptyDrives4() ; ?? Can you find BUGs on this function?
        Local $sResult, $sDrive

        $aDrive = DriveGetDrive("All")
        For $i = 1 To 26
                $sDrive &= Chr($i + 96)
        Next
        $sResult = "ab" & StringTrimLeft($sDrive, 2 + $aDrive[0])
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives4

Func _GetEmptyDrives5()
        Local $aDrive, $aEnum, $sResult, $iFlags

        $aDrive = DriveGetDrive("All")
        For $i = 1 To 26
                $aEnum &= Chr(96 + $i)
        Next
        $aEnum = StringSplit($aEnum, "")
        For $j = 1 To $aEnum[0]
                $iFlags = 0
                For $i = 1 To $aDrive[0]
                        If ($aEnum[$j] & ":" = $aDrive[$i]) Then
                                $iFlags = 1
                                ExitLoop
                        EndIf
                Next
                If $iFlags = 0 Then $sResult &= $aEnum[$j]
        Next
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives5

Func _GetEmptyDrives6()
        Local $sResult, $hFile

        For $i = 1 To 26
                $hFile = _WinAPI_CreateFile("\\." & Chr(96 + $i) & ":", 0, 0, 0, 0, 0)
                If _WinAPI_GetLastError() = 2 Then $sResult &= Chr(96 + $i)
                If ($hFile > 0) Then _WinAPI_CloseHandle($hFile)
        Next
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives6

评分

参与人数 1金钱 +10 收起 理由
天堂泪吻泪 + 10 的确让在下长知识了!

查看全部评分

发表于 2010-2-5 01:13:34 | 显示全部楼层
本帖最后由 afan 于 2010-2-5 01:21 编辑

回复 1# 天堂泪吻泪


    方法的确很多…… 这里修改LZ要求的两层For的问题
#include <array.au3>

$letter = _GetDriverEmptyLetter()
_ArrayDisplay($letter)

Func _GetDriverEmptyLetter()
        Local $AllLetter[1] = [0], $Disk = DriveGetDrive("ALL")
        Local $i, $j, $n = 1, $tmp, $ck = 0
        For $i = 3 To 26 ;直接略去a、b盘
                $tmp = Chr(96 + $i) & ":"
                For $j = 1 To $Disk[0]
                        If $tmp = $Disk[$j] Then
                                $ck = 1
                                ExitLoop
                        Else
                                $ck = 0
                        EndIf
                Next
                If $ck = 0 Then
                        $n += 1
                        ReDim $AllLetter[$n] ;LS的老大给出的最后才输出就是效率,建议修改
                        $AllLetter[$n - 1] = $tmp
                EndIf
        Next
        $AllLetter[0] = $n - 1
        Return $AllLetter
EndFunc   ;==>_GetDriverEmptyLetter

评分

参与人数 1金钱 +10 收起 理由
天堂泪吻泪 + 10 感谢你对在下帮助,谢谢!

查看全部评分

发表于 2010-2-5 01:28:56 | 显示全部楼层
回复 3# afan


   Quote:
   ;LS的老大给出的最后才输出就是效率,建议修改
——这句愣是没看懂。- -||||
发表于 2010-2-5 01:32:42 | 显示全部楼层
回复  afan


   Quote:
   ;LS的老大给出的最后才输出就是效率,建议修改
——这句愣是没看懂。- -| ...
pusofalse 发表于 2010-2-5 01:28


就是说您呐,先不去声明数组、ReDim之类的,用 &= 连接为字符串,最后用 StringSplit 输出 = 高效率,您老大一贯的原则“高效率”
发表于 2010-2-5 01:40:16 | 显示全部楼层
回复 5# afan



    - -|||,原谅我愚钝,现在我看懂了表面意思,afan兄内在的涵义还没弄清。
1、您?老大?为何用这样的称呼呢?
2、高效率? or “高效率”?
3、建议修改?既然是高效,为何要修改呢?
发表于 2010-2-5 01:46:09 | 显示全部楼层
1,算啦,还是用 pusofalse 超版吧……
2,“”在这起强调的作用……
3,是建议LZ修改成你的代码,以提高效率

菜鸟我没法用编程的语言解释,只能如此了.... - - ||
发表于 2010-2-5 01:50:59 | 显示全部楼层
回复 7# afan


    - -|||
原谅我愚钝至极。
抱歉至极。
发表于 2010-2-5 02:05:08 | 显示全部楼层
回复 8# pusofalse


    哪里哪里,是超版你太过谦了.

另外,LZ想按自己的思路完成那也是很要支持的,有创造力总比固有的思维要好。在固有好的基础上再创造可能会更好。呵呵
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-29 07:17 , Processed in 0.094823 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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