当我在命令提示符下键入弹出时,我试图弹出我的闪存驱动器,我有一个代码的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
在那之后我需要弹出代码
答案 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);