如何以批处理或Vbs方式弹出闪存驱动器

时间:2014-12-01 15:23:42

标签: batch-file vbscript

当我在命令提示符下键入弹出时,我试图弹出我的闪存驱动器,我有一个代码的shell,但我没有实际的代码来弹出它。

UNLOCK

@echo off
echo '
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p

if %password%==Eject goto EJECT

:EJECT

^if EXIST "D:\Some file in the Flash drive" goto D-DRIVE

:D-DRIVE

^code that ejects the D drive

在那之后我需要弹出代码

1 个答案:

答案 0 :(得分:2)

我即将评论mojo在同一时间所做的同样的事情。但是,经过测试,似乎脚本diskpart卸载我自己的可移动驱动器会阻止它们在下次插入时自动重新获取驱动器号。我必须转到磁盘管理并重新启动 - 重新插入时分配驱动器号。我确定这不是你想要的。使用Win32_Volume like this guy did编写一个卸载脚本具有相同的不幸副作用。

使用hotplug.dll like this guy did玩游戏也不是很有帮助,因为Windows报告驱动器类型不是可移动驱动器。

不,不需要第三方实用程序的最可靠,最少副作用的方法是调用" Eject"来自"我的电脑" -ish上下文的动词。这是一个涉及批处理/ JScript混合脚本的解决方案:

@if (@a==@b) @end   /* JScript ignores this multiline comment

:: dismount.bat
:: safely dismounts all removable drives

@echo off
setlocal

cscript /nologo /e:JScript "%~f0"

goto :EOF

:: end batch portion / begin JScript portion */

// DriveType=1 means removable drive for a WScript FSO object.
// See http://msdn.microsoft.com/en-us/library/ys4ctaz0%28v=vs.84%29.aspx

// NameSpace(17) = ssfDRIVES, or My Computer.
// See http://msdn.microsoft.com/en-us/library/windows/desktop/bb774096%28v=vs.85%29.aspx

var oSH = new ActiveXObject('Shell.Application'),
FSO = new ActiveXObject('Scripting.FileSystemObject'),
removableDriveType = 1,
ssfDRIVES = 17,
drives = new Enumerator(FSO.Drives);

while (!drives.atEnd()) {
    var x = drives.item();
    if (x.DriveType == removableDriveType) {
        oSH.NameSpace(ssfDRIVES).ParseName(x.DriveLetter + ':').InvokeVerb('Eject');
        while (x.IsReady)
            WSH.Sleep(50);
    }
    drives.moveNext();
}

此外,您可以调用" Eject"使用PowerShell in a similar way来自同一命名空间的动词,但您仍然需要Start-Sleep来阻止ps线程在驱动器弹出之前退出。如果他喜欢PowerShell而不是WScript,我会将其留作O.P.的练习。


编辑:如果要在批处理脚本中定义要卸除的特定驱动器,请执行以下操作:

@if (@a==@b) @end   /*

@echo off
setlocal

set "drive=F:"

cscript /nologo /e:JScript "%~f0" "%drive%"

goto :EOF

::  */

var oSH = new ActiveXObject('Shell.Application'),
    FSO = new ActiveXObject('Scripting.FileSystemObject'),
    drive = WSH.Arguments(0);

oSH.NameSpace(17).ParseName(drive).InvokeVerb('Eject');
while (FSO.GetDrive(drive).IsReady) WSH.Sleep(50);