找回密码
 加入
搜索
查看: 7872|回复: 24

[AU3基础] Run DOS命令有时候行,有时候不行-已解决

[复制链接]
发表于 2020-11-8 22:54:58 | 显示全部楼层 |阅读模式
本帖最后由 rally 于 2020-11-14 14:19 编辑

  很奇怪,一直查没知道原因,希望大神能指点!看网上说需要Admin权限,加#RequireAdmin也没用。有时候放在别的程序中也能运行,但单独测试还是不行,win10/win7 都出现不稳定

#include <ProgressConstants.au3>
#include <Process.au3>
#include <File.au3>
#RequireAdmin


$i=0
MsgBox(0,"",AdjustDriveExist($i))

Func AdjustDriveExist($i)   ;判断硬盘是否存在
   RunWait(@ComSpec & ' /C (echo list disk | diskpart) > ' & @TempDir & "\Temp\list.txt" , "", @SW_HIDE)
   $file = @TempDir & "\Temp\list.txt"
   $var = "磁盘 " & $i
   $content = FileRead($file)
   MsgBox(0,"",$content)
   If StringInStr($content,$var)  Then
          $st = 1
   Else
      $st = 0
   EndIf
   return $st
EndFunc



发表于 2020-11-8 23:55:18 | 显示全部楼层
obj来判断 obj来判断
发表于 2020-11-9 00:56:19 | 显示全部楼层
$i = 0
MsgBox(0, "", AdjustDriveExist($i))

Func AdjustDriveExist($i) ;判断硬盘是否存在
        Local $sTempfile1 = @TempDir & '\_tmp1.txt'
        Local $sTempfile2 = @TempDir & '\_tmp2.txt'
        If FileExists($sTempfile1) Then FileDelete($sTempfile1)
        FileWriteLine($sTempfile1, 'list disk')
        RunWait(@ComSpec & ' /C @echo off&diskpart.exe /s "' & $sTempfile1 & '">"' & $sTempfile2 & '"', "", @SW_HIDE)
        Local $sContent = FileRead($sTempfile2)
        FileDelete($sTempfile1)
        FileDelete($sTempfile2)
        Return StringRegExp($sContent, '(?m)磁盘\h+' & $i & '(?!\d)', 0) = True
EndFunc   ;==>AdjustDriveExist

 楼主| 发表于 2020-11-9 09:25:51 | 显示全部楼层
zhao_ming 发表于 2020-11-8 23:55
obj来判断 obj来判断

obj来判断?能帮说具体一点吗?我新手,这块还没弄明白。谢谢!
 楼主| 发表于 2020-11-9 09:41:09 | 显示全部楼层

谢谢! 您的确实可以,我还是不太明白的我那个代码问题点在哪里,我在很多电脑上都是可以运行的,有时候又不行。
下面也是同样的runwait问题,有时候行有时候又不行。
是RunWait 里面的变量有问题吗?
  $file2 = @ScriptDir & "\set\VID.txt"
   Local  $array[19]=["H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
   $vid = $array[$i]
   $assign = "assign letter=" & $vid
   Local $diskno = FileReadLine($file2,3)
   _ReplaceStringInFile($file2, $diskno,$assign, 0, 1);选择对应磁盘
   Local $szSearchString2 = FileReadLine($file2,1)
   Local $szReplaceString2 = "select disk " & $i
   _ReplaceStringInFile($file2, $szSearchString2,$szReplaceString2, 0, 1)
   Runwait("diskpart /S " & $file2,"",@SW_HIDE);分配磁盘驱动器号
   RunWait(@ComSpec & " /c " & 'format ' & $vid &': /fs:ntfs /y /q >>log.txt', "", @SW_HIDE);格式化磁盘
发表于 2020-11-11 18:33:35 | 显示全部楼层
本帖最后由 itsky2 于 2020-11-11 18:35 编辑

#include <Array.au3>
#include <WinAPI.au3>

_ArrayDisplay(_Get_DiskList())

Func _Get_DiskList()
        Local $aDiskNum, $aAllDevice
        
        $aAllDevice = _WinAPI_QueryDosDevice('')
        If @error Then Return SetError(@error + 5, @extended, '')
        
        $aDiskNum = _Array1D_InStringToArray($aAllDevice, '^(PhysicalDrive\d+)$')
        
        If UBound($aDiskNum) < 2 Then Return SetError(1, 0, '')
        
        For $i = 1 To UBound($aDiskNum) - 1
                $aDiskNum[$i] = StringReplace($aDiskNum[$i], 'PhysicalDrive', '')
        Next
        
        $aDiskNum[0] = UBound($aDiskNum) - 1
        
        Return $aDiskNum
EndFunc   ;==>_Get_DiskList
Func _Array1D_InStringToArray(Const ByRef $aArray1D, $vValue, $iCase = False)
        If (Not IsArray($aArray1D)) Or (UBound($aArray1D, 0) > 1) Then Return SetError(1, 0, 0)
        
        Local $aReturn[1]
        
        For $i = 0 To UBound($aArray1D) - 1
                If StringRegExp($aArray1D[$i], ($iCase ? '' : '(?i)') & $vValue) Then _ArrayAdd($aReturn, $aArray1D[$i])
        Next
        
        $aReturn[0] = UBound($aReturn) - 1
        Return $aReturn
EndFunc   ;==>_Array1D_InStringToArray


发表于 2020-11-11 18:34:38 | 显示全部楼层
以上函数可获取当前设备上全部磁盘号的数组,其中数组[0]项纪录磁盘总数
 楼主| 发表于 2020-11-12 22:30:28 | 显示全部楼层

谢谢!API还没有涉及到,这个很不错,速度快很多
发表于 2020-11-13 20:04:53 | 显示全部楼层
解决了就修改标题
Local $ii = 0
MsgBox(0, '', '硬盘' & $ii & (FileRead('\\.\PhysicalDrive' & $ii, 1) ? ' 存在' : ' 不存在'))
 楼主| 发表于 2020-11-13 20:48:25 | 显示全部楼层
谢谢版主大大
发表于 2020-11-14 10:31:11 | 显示全部楼层

改标题的版规看了吗?提醒了
发表于 2020-11-14 18:46:09 | 显示全部楼层
afan 发表于 2020-11-13 20:04
解决了就修改标题

这个不太稳妥。
如果计算机上有三个设备,第二个设备拔掉之后,第三个设备的编号仍然是2。也就是说,设备编号不是连续的,理论上相隔很多个都有可能。
发表于 2020-11-14 18:59:03 | 显示全部楼层
itsky2 发表于 2020-11-14 18:46
这个不太稳妥。
如果计算机上有三个设备,第二个设备拔掉之后,第三个设备的编号仍然是2。也就是说,设 ...

必须是连续的。你试试LZ的代码,看看是不是连续的。你的理论不太现实。
 楼主| 发表于 2020-11-14 19:12:07 | 显示全部楼层
我的代码判断可以是不连续的,就是为了检测不连续的情况,三个盘抽调一个,例如0,1,2,3,抽掉2,也可以检测到3的存在,2的不存在
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 07:47 , Processed in 0.088000 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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