rally 发表于 2020-11-8 22:54:58

Run DOS命令有时候行,有时候不行-已解决

本帖最后由 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



zhao_ming 发表于 2020-11-8 23:55:18

obj来判断 obj来判断

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

rally 发表于 2020-11-9 09:25:51

zhao_ming 发表于 2020-11-8 23:55
obj来判断 obj来判断

obj来判断?能帮说具体一点吗?我新手,这块还没弄明白。谢谢!

rally 发表于 2020-11-9 09:41:09

zghwelcome 发表于 2020-11-9 00:56


谢谢! 您的确实可以,我还是不太明白的我那个代码问题点在哪里,我在很多电脑上都是可以运行的,有时候又不行。
下面也是同样的runwait问题,有时候行有时候又不行。
是RunWait 里面的变量有问题吗?
$file2 = @ScriptDir & "\set\VID.txt"
   Local$array=["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);格式化磁盘

itsky2 发表于 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 = 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
      
      For $i = 0 To UBound($aArray1D) - 1
                If StringRegExp($aArray1D[$i], ($iCase ? '' : '(?i)') & $vValue) Then _ArrayAdd($aReturn, $aArray1D[$i])
      Next
      
      $aReturn = UBound($aReturn) - 1
      Return $aReturn
EndFunc   ;==>_Array1D_InStringToArray


itsky2 发表于 2020-11-11 18:34:38

以上函数可获取当前设备上全部磁盘号的数组,其中数组项纪录磁盘总数

rally 发表于 2020-11-12 22:30:28

itsky2 发表于 2020-11-11 18:33
#include
#include



谢谢!API还没有涉及到,这个很不错,速度快很多

fyq 发表于 2020-11-13 10:27:00

学到一招!!!

afan 发表于 2020-11-13 20:04:53

解决了就修改标题
Local $ii = 0
MsgBox(0, '', '硬盘' & $ii & (FileRead('\\.\PhysicalDrive' & $ii, 1) ? ' 存在' : ' 不存在'))

rally 发表于 2020-11-13 20:48:25

谢谢版主大大:face (1):

afan 发表于 2020-11-14 10:31:11

rally 发表于 2020-11-13 20:48
谢谢版主大大

改标题的版规看了吗?提醒了

itsky2 发表于 2020-11-14 18:46:09

afan 发表于 2020-11-13 20:04
解决了就修改标题

这个不太稳妥。
如果计算机上有三个设备,第二个设备拔掉之后,第三个设备的编号仍然是2。也就是说,设备编号不是连续的,理论上相隔很多个都有可能。

afan 发表于 2020-11-14 18:59:03

itsky2 发表于 2020-11-14 18:46
这个不太稳妥。
如果计算机上有三个设备,第二个设备拔掉之后,第三个设备的编号仍然是2。也就是说,设 ...

必须是连续的。你试试LZ的代码,看看是不是连续的。你的理论不太现实。

rally 发表于 2020-11-14 19:12:07

我的代码判断可以是不连续的,就是为了检测不连续的情况,三个盘抽调一个,例如0,1,2,3,抽掉2,也可以检测到3的存在,2的不存在
页: [1] 2
查看完整版本: Run DOS命令有时候行,有时候不行-已解决