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
obj来判断 obj来判断 $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
zhao_ming 发表于 2020-11-8 23:55
obj来判断 obj来判断
obj来判断?能帮说具体一点吗?我新手,这块还没弄明白。谢谢! 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: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:33
#include
#include
谢谢!API还没有涉及到,这个很不错,速度快很多 学到一招!!! 解决了就修改标题
Local $ii = 0
MsgBox(0, '', '硬盘' & $ii & (FileRead('\\.\PhysicalDrive' & $ii, 1) ? ' 存在' : ' 不存在')) 谢谢版主大大:face (1): rally 发表于 2020-11-13 20:48
谢谢版主大大
改标题的版规看了吗?提醒了 afan 发表于 2020-11-13 20:04
解决了就修改标题
这个不太稳妥。
如果计算机上有三个设备,第二个设备拔掉之后,第三个设备的编号仍然是2。也就是说,设备编号不是连续的,理论上相隔很多个都有可能。 itsky2 发表于 2020-11-14 18:46
这个不太稳妥。
如果计算机上有三个设备,第二个设备拔掉之后,第三个设备的编号仍然是2。也就是说,设 ...
必须是连续的。你试试LZ的代码,看看是不是连续的。你的理论不太现实。 我的代码判断可以是不连续的,就是为了检测不连续的情况,三个盘抽调一个,例如0,1,2,3,抽掉2,也可以检测到3的存在,2的不存在
页:
[1]
2