Batch file 如何在批处理或Vbs中弹出闪存驱动器

Batch file 如何在批处理或Vbs中弹出闪存驱动器,batch-file,vbscript,Batch File,Vbscript,当我在命令提示符中键入eject时,我试图弹出我的闪存驱动器,我有一个代码外壳,但我没有实际的代码来弹出它 解锁 @echo off echo ' set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^ $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^[Sy

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

解锁

@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

在那之后,我需要弹出代码

我正要评论mojo在大约同一时间做的同样的事情。但是,在测试之后,似乎通过脚本
diskpart
卸载我自己的可移动驱动器会阻止它们在下次插入时自动重新获取驱动器号。在重新插入时,我必须转到磁盘管理并重新分配驱动器盘符。我肯定那不是你想要的。用Win32_卷编写卸载脚本也有同样不幸的副作用

hotplug.dll
也没有多大帮助,因为Windows报告该类型的驱动器不是可移动驱动器

不,不需要第三方实用程序的最可靠、副作用最小的方法是从“我的电脑”上下文调用“弹出”动词。下面是一个涉及batch/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();
}
此外,您可以使用PowerShell从同一名称空间调用“Eject”谓词,但仍需要
启动Sleep
以防止ps线程在驱动器弹出之前退出。如果O.P.更喜欢PowerShell而不是WScript,我就把它留给他做练习


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

@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);

超级用户:您也可以使用-有没有一种方法可以在VBScript中实现,或者java是唯一的方法?我更喜欢简单的弹出方式,如果这是最简单的方式,那么我就选择它。这不是Java。它甚至不是JavaScript,尽管这会有更密切的联系。它是JScript,是VBScript的近亲。是的。我之所以使用JScript,是因为以批处理混合方式运行JScript片段比将VBscript块回送到单独的vbs文件要优雅得多。不,这不是唯一的办法。如果我只是随意地
WSH.Sleep(1000)
或类似的方式,实际上也可以用更少的JScript代码行来完成,但是如果有一个打开的句柄阻止了弹出操作,那么这可能会导致问题。JScript Nevermind最后一条注释的结尾是什么,你怎么让它只弹出F驱动器我不知道我很愚蠢,但它不工作。你能给我一个基本代码或什么帮助吗