天道酬勤,学无止境

如何批量或 Vbs 弹出闪存驱动器(How to Eject a Flash drive in Batch or Vbs)

问题

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

开锁

@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

我几乎在同一时间评论了上面 mojo 所做的同样的事情。 但是,经过测试,似乎脚本diskpart卸载我自己的可移动驱动器会阻止它们在下次插入时自动重新获取驱动器号。重新插拔。 我确定那不是你想要的。 像这个人一样用 Win32_Volume 编写卸载脚本也有同样不幸的副作用。

像这个人一样使用hotplug.dll也没有多大帮助,Windows 报告驱动器类型不是可移动驱动器。

不,不需要 3rd 方实用程序的最可靠、副作用最小的方法是从“我的电脑”-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();
}

此外,您可以使用 PowerShell 以类似方式从同一命名空间调用“Eject”动词,但您仍然需要Start-Sleep以防止 ps 线程在驱动器被弹出之前退出。 如果 OP 更喜欢 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);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在没有外部文件的 WinPE 中识别 CD 驱动器并使用 bat 或 vbs 弹出(Identify CD drive and eject using bat or vbs while in WinPE without external files)
    问题 我需要识别 CD 驱动器并弹出托盘。 这是在 WinPE 中启动时执行的,因此 WMP 弹出功能不可用。 此脚本将用于各种计算机型号/配置。 我目前正在使用这个: For Each d in CreateObject("Scripting.FileSystemObject").Drives CreateObject("Shell.Application").Namespace(17).ParseName("D:\").InvokeVerb("Eject") Next 它可以工作,但有时会出错并需要用户交互才能弹出。 我怀疑这是因为硬编码的D:\驱动器号,但我可能完全错了。 我需要它在没有 3rd 方实用程序的情况下工作。 回答1 使用 Drive 对象的 DriveType 属性: For Each d in CreateObject("Scripting.FileSystemObject").Drives WScript.sleep 60 If d.DriveType = 4 Then CreateObject("Shell.Application").Namespace(17).ParseName(d.DriveLetter & ":\").InvokeVerb("Eject") End If Next 回答2 这是使用媒体播放器弹出的代码; 我不确定从您的 WinPE
  • 如何在Windows 7中通过闪存驱动器使用自动运行来打开网页?(How to use autorun in Windows 7 from a Flash drive to open a webpage?)
    问题 我一直在想出一种方法来自动运行USB闪存驱动器上托管的一系列HTML页面。 这些都是静态页面,并且都链接到闪存驱动器根目录中的index.html。 我试着像这样设置一个autorun.inf文件: [autorun] open=index.html 我也尝试过这个: [autorun] shellexecute=index.html 我已经试过了: [autorun] open=wscript.exe autorun.vbs autorun.vbs如下所示: Call WScript.CreateObject("WScript.Shell").Run("index.html", 1) 到目前为止,我还没有让应用程序出现在自动运行对话框上的运气。 我什至拥有一个与此类似的更强大的autorun.inf: [autorun] shellexecute=index.html label=Test Application action=Start Test Application shell\start=Start Application shell\start\command=index.html shell=start 我以许多不同的配置切换了各种shellexecute / open命令。 然后,我在研究过程中偶然发现了一个页面,上面写着“ Windows
  • 如何确定USB闪存驱动器制造商?(how to determine USB Flash drive manufacturer?)
    问题 我需要我的程序只能与某些USB闪存驱动器(来自单个制造商)一起使用,而忽略所有其他USB闪存驱动器(来自任何其他制造商)。 是否可以使用.NET 2.0检查Windows上是否插入了特定的USB卡? 如何? 如果通过WMI找到它,是否可以确定USB驱动器在哪个驱动器盘符上? 回答1 编辑:添加代码以打印驱动器号。 检查此示例是否适合您。 它使用WMI。 Console.WriteLine("Manufacturer: {0}", queryObj["Manufacturer"]); ... Console.WriteLine(" Name: {0}", c["Name"]); // here it will print drive letter 完整的代码示例: namespace WMISample { using System; using System.Management; public class MyWMIQuery { public static void Main() { try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_DiskDrive"); foreach (ManagementObject
  • 在 Windows 10 中批量运行 VBS 脚本时解压缩文件错误(Unzip file error when running VBS script from a batch in Windows 10)
    问题 在 Win 10 中运行 VBS 解压缩代码批处理时,出现以下错误。 鉴于其他人之前曾报道过这种情况,这可能是什么原因? 更改目标目录或明确设置它们不会影响错误。 @echo off setlocal enabledelayedexpansion cd /d %~dp0 set vbs="%temp%\_.vbs" call :UnZipFile "E:\Temp\" "%USERPROFILE%\Downloads\archive.zip\" exit /b :UnZipFile <ExtractTo> <newzipfile> if exist %vbs% del /f /q %vbs% >%vbs% echo Set fso = CreateObject("Scripting.FileSystemObject") >>%vbs% echo If NOT fso.FolderExists(%1) Then >>%vbs% echo fso.CreateFolder(%1) >>%vbs% echo End If >>%vbs% echo set objShell = CreateObject("Shell.Application") >>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items >>%vbs% echo
  • 仅知道驱动器号,确定驱动器是否可移动(闪存或 HDD)(determine if drive is removable (flash or HDD) knowing only the drive letter)
    问题 我正在尝试确定文件是否在本地驱动器上。 我找到了检索驱动器类型的 GetDriveType() WINAPI。 然而,阅读返回值的描述似乎是,这就是我的理解,它将闪存驱动器检索为 FIXED,这不是我想要的。 它在本地驱动器上工作正常: bool IsDriveRemovableOrRemote(CString driveRoot) { UINT driveType = GetDriveType(driveRoot); return (DRIVE_REMOVABLE == driveType || DRIVE_CDROM == driveType || DRIVE_NO_ROOT_DIR == driveType || DRIVE_REMOTE == driveType); } 我没有用于测试 ATM 的闪存/外部驱动器,但我想知道是否有人可以告诉我我的解释是否正确? 如果是这样,我应该使用什么更好的替代方案? 请记住,我只有文件的路径。 回答1 您应该更仔细地阅读文档。 虽然闪存驱动器被视为固定设备,但该链接页面中有一条注释: 要确定驱动器是否为 USB 类型驱动器,请调用 SetupDiGetDeviceRegistryProperty 并指定 SPDRP_REMOVAL_POLICY 属性。 如果您从路径开始,这个过程似乎有点混乱,但您可以在这里开始阅读 doco。
  • 如何从命令行从包含类在包中的闪存驱动器运行 java 程序?(how to run java program from flash drive that has classes in package, from command line?)
    问题 我有一个任务,我必须在闪存驱动器中提交我的代码。 我在 Eclipse 中完成了所有编码并获得了所有输出。 我尝试通过命令行运行它并且它有效。 我将所有 java 文件和类文件复制到闪存驱动器,然后通过命令行再次尝试,它在我的笔记本电脑上工作。 但是当我进行那次潜水并将其放入我的台式计算机并通过命令行运行时,它无法识别包中的类。 我在这个包下有一个包 a1.cis568 我有几个类。 主类是A1 ,其他类是Circle , Point , PlaneCircle , EHashtable , CHashtable在同一个包中。 我必须在命令行上使用以下行来通过闪存驱动器编译和运行我的程序,(这样做时不必更改任何类路径) E:> E:>javac -d . A1.java E:>java a1.cis568.A1 当我在寻找解决方案时,我发现我可以在闪存驱动器上安装 JDK 并运行代码。 我尝试安装 JDK 但它没有解决我的问题。 回答1 您似乎在编译源代码时遇到了麻烦! 由于您在包层次结构中导航到A1.java所在的位置,然后尝试编译,因此编译器无法找到A1依赖的其他类以及不在同一目录中的其他类。 您必须告诉它在哪里可以找到它们,这是使用javac的选项-sourcepath 。 因此,从A1.java类的同一位置,您可以使用以下内容编译您的代码: E:> javac -d
  • 有没有办法从命令行弹出所有外部硬盘驱动器? (OS X)(is there a way to eject all external hard drives from the command line? (OS X))
    问题 有没有办法从命令行弹出 OS X 计算机上所有已安装的硬盘驱动器卷? 如果我可以将它包装在 shell 脚本中,Applescript 就可以了。 回答1 在终端尝试: umount -a (通过 getfsent(3) 描述的所有文件系统都被卸载。) umount -A (所有当前挂载的文件系统除根目录外都已卸载。) 有关更多信息,请参阅man umount 。 更新: 好像你也可以用这个: diskutil unmountDisk /dev/disk* 不过没试过。 如果它不起作用,请尝试使用“unmount”而不是“unmountDisk”。 哦,我还找到了eject参数(而不是unmountDisk )。 这可能也很有趣。 更新 2: diskutil eject /dev/*似乎是您正在寻找的(见评论)。 回答2 还有另一种优雅的方法可以在不知道确切名称的情况下卸载所有外部硬盘驱动器: osascript -e 'tell application "Finder" to eject (every disk whose ejectable is true)' 要忽略网络安装和光盘,请使用: osascript -e 'tell application "Finder" to eject (every disk whose ejectable is true and
  • 插入 USB 闪存驱动器时如何防止自动播放并运行我自己的应用程序(How to prevent autoplay and run my own app when inserting an USB-Flash drive)
    问题 插入 USB 闪存驱动器时,Windows 通常会打开自动播放对话框,提供浏览驱动器的功能,或者如果有多媒体文件,它会提供选择一个应用程序来打开它们。 我们开发了一个媒体播放器,它连接到 USB 驱动器并将自己注册为大容量存储设备。 我需要的是,在插入播放器时不显示此对话框,而是启动我自己的应用程序。 理想情况下,该应用程序应位于闪存驱动器本身上,但据我所知,USB 驱动器禁用了自动运行。 如果启动预安装的应用程序就足够了。 我已经尝试捕捉 WM_DRIVE_CHANGE 消息,但这仅在我的应用程序是最顶部的窗口时才有效,否则会显示自动播放对话框。 最好的汤姆 回答1 经过对谷歌的长期研究,我发现了这个论坛帖子: http://social.msdn.microsoft.com/Forums/uk-UA/windowssdk/thread/aef929cb-62ac-4371-b7de-2c07adf3c6a7 我遵循了这个,这是工作代码: [Flags()] public enum AutorunContent : int { AutorunInf = 2, AudioCD = 4, DVDMovie = 8, BlankCD = 16, BlankDVD = 32, UnknownContent = 64, AutoPlayPictures = 128
  • 批量cmd弹出消息(Pop up Message in batch cmd)
    问题 echo msgbox "Hey! Here is a message!" > %tmp%\tmp.vbs cscript /nologo %tmp%\tmp.vbs del %tmp%\tmp.vbs 或者 echo msgbox "Hey! Here is a message!" > %tmp%\tmp.vbs wscript %tmp%\tmp.vbs del %tmp%\tmp.vbs 我在其他线程中找到了这些,但是如何在文本上设置多行? 回答1 像这样: echo msgbox Replace("Hey!\nHere is a message!", "\n", vbLf) > %tmp%\tmp.vbs cscript /nologo %tmp%\tmp.vbs del %tmp%\tmp.vbs 回答2 不像 Ekkehard 的那么短,而是在一个单一的混合文件中。 msgbox 的正常返回码减 1 为零 - 点击 abort 将返回 1,因此中止调用。 <!-- : Begin batch script @echo off&SETLOCAL EnableDelayedExpansion echo. echo Step1: Closing Explorer . . . echo. Call :MsgBox "Do you really want to
  • 闪存技术最全面解析
    大家好,今天为大家准备了闪存技术大餐,内容涉及闪存架构、关键技术、颗粒、接口和可靠性等方方面面。部分内容之前在本号上发布过,但内容不系统、技术不全面,今天我专门花时间进行梳理和总结。内容丰富且基本全是原创,请耐心往下看,希望对大家理解闪存有所帮助。 闪存最明显特点就是稳定性能,低时延和高随机IOPS。对于闪存,在评估性能时,我们一般主要关注90% IO落入规定的时延范围(性能是一个线性范围,而不是某一个点)。数据保护等追求所有软件特性都基于Inline实现,如Inline重删、压缩、Thin-Provisioning(尤其是重删,一方面SSD价格还是偏高,重删压缩可以节约投入成本;另一方面也减少了IO下盘次数提高SSD寿命)。但对于闪存,我们所关注的特性和技术指标远远不止这些。闪存架构 闪存的Scale out能力: 横向扩展能力是应对并发访问和提升性能容量的最基本特性,所以闪存是必须具备的功能。目前XtremIO支持16控,solidfire已经支持但100个控制器节点。 控制器对称A/A 能力: 闪存的主要应用场景如OLTP等,传统的A/P、ALUA阵列在主控制器故障切换时都需要时间切换,并导致IO归零;并且在闪存阵列下,一般系统CPU是瓶颈,所以只有无归属、性能均衡的A/A对称架构才能更好应对。目前传统存储(如EMC VMAX/VNX,HP 3PAR, HDS USP/VSP
  • 如何找到闪存设备的唯一序列号?(How to find the unique serial number of a flash device?)
    问题 我发现了几个片段和.pas文件,它们可以检测何时插入和移除USB闪存驱动器。 有些提供了各种有用的信息,但是我需要的是设备的唯一序列号,而不是卷的序列号。 我当前的.pas文件(我不记得在哪里找到)也似乎检测到SD卡(我喜欢)。 如果您想看一下,可以在这里找到(它仅返回驱动器号并已插入/卸下): unit UsbDetector; interface uses Classes; type TUsbDriveChanged = procedure (Sender: TObject; Drive: string; Attached: boolean) of object; procedure StartUsbDetector(NotifyProc: TUsbDriveChanged); procedure StopUsbDetector; implementation uses Windows, Messages, Forms, SysUtils; type TUSBDetector = class(TObject) private fUsbDriveChanged: TUsbDriveChanged; protected procedure DeviceChanged(Msg: UINT; wParam, lParam: Longint); procedure
  • 从 USB 闪存驱动器自动运行程序 [关闭](Auto-Running a program from USB flash drive [closed])
    问题 关闭。 这个问题是题外话。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 9年前关闭。 改进这个问题 我一直在互联网上寻找配置闪存驱动器以自动播放位于其根文件夹中的文件的方法,但似乎没有任何效果...... 目前,我有一个presentation.html文件,需要在用户插入USB记忆棒时启动,没有任何提示。 我尝试了几种解决方案,并多次确保我的系统上的自动运行已设置。 我创建了一个“autorun.inf”文件: [autorun] UseAutoPlay=1 ShellExecute=presentation.html ACTION=View the presentation 甚至尝试将其配置为调用批处理文件“mybatchfile.bat” start presentation.html 似乎没有任何效果...每次插入闪存驱动器时,它都会提示我想对文件“打开文件夹;使用媒体播放器播放;等等...”执行什么操作,但不会运行演示文稿.html。 非常感谢任何建议或提示。 回答1 它是后 XP Windows 版本的安全功能。 我不确定它是否也在 XP 中。 Windows 根本不会在用户不希望的情况下启动内容。 它会一直问你。
  • 检测可移动驱动器(例如 USB 闪存驱动器) C/C++(Detect removable drive (e.g. USB flash drive) C/C++)
    问题 如何检测可移动磁盘驱动器何时(断开)连接到系统? 如何获取挂载路径(对于 Linux)和驱动器号(对于 Windows)? 编辑:有没有办法检测当前连接的设备? 回答1 对于 Windows,API RegisterDeviceNotification 会在添加 USB 设备时通知您。 有关卷的信息在 DEV_BROADCAST_VOLUME 结构中给出。 dbcv_unitmask给出驱动器号。 回答2 您可以从 shell 获取更改通知(用于添加/删除驱动器)。 您可以使用此 Delphi 代码作为文档: unit UnitChangeNotify; interface uses Windows, Messages, SysUtils, Classes, ShlObj, Types; type SHChangeNotifyEntry = record pidlPath : PItemIDList; bWatchSubtree : Boolean; end; TChangeEventType = ( cnAssocchanged, cnAttributes, cnCreate, cnDelete, cnDriveAdd, cnDriveAddGui, cnDriveRemoved, cnMediaInserted, cnMediaRemoved, cnMkdir
  • UDEV-在USB闪存驱动器插件上运行程序(UDEV - Run program on USB flash drive insert [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 7年前关闭。 改善这个问题 每当尝试将任何USB闪存驱动器(不仅是特定的USB闪存驱动器)插入系统时,我都试图运行一个脚本,并且我已经断断续续地花了大约2周的时间来尝试找出问题。 有谁能够帮我? (如果有帮助,请运行Ubuntu)。 我需要至少传递驱动器序列号和devpath(/ dev / sd **)。 回答1 首先,您需要使用规则来检测USB存储设备 /etc/udev/rules.d/10-usbmount.rules: KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", RUN+="/usr/bin/usbdevinserted" 这将运行我们的自定义可执行shell脚本/usr/bin/usbdevinserted : #!/bin/bash set 2>&1 >> /tmp/usbdevinfo 此示例脚本转储您需要知道找到哪个设备的环境变量,例如: DEVLINKS='/dev/disk/by-id/usb-Generic_USB_Flash_Disk-0:0 /dev/disk/by-path/pci-0000:00:13.2-usb-0:2:1
  • 如何在批处理文件中请求管理员访问(How to request Administrator access inside a batch file)
    问题 我正在尝试为我的用户编写一个批处理文件,以便使用UAC在其Vista机器上运行。 该文件正在重写其主机文件,因此需要在具有管理员权限的情况下运行。 我需要能够向他们发送一封电子邮件,其中包含指向.bat文件的链接。 期望的行为是,当他们右键单击该文件并说“打开”时,他们将获得那些UAC对话框之一,该对话框使屏幕变黑并迫使他们回答是否要授予应用程序权限以管理员身份运行。 相反,他们只是在命令行窗口中看到“拒绝访问”。 这有可能做不同的事情吗? 回答1 这个脚本可以解决问题! 只需将其粘贴到bat文件的顶部即可。 如果要查看脚本的输出,请在批处理文件的底部添加“暂停”命令。 更新:现在对该脚本进行了稍微的编辑,以支持命令行参数和64位OS。 谢谢Eneerge @ https://sites.google.com/site/eneerge/scripts/batchgotadmin @echo off :: BatchGotAdmin :------------------------------------- REM --> Check for permissions IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" ( >nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%
  • 如果双击批处理文件运行良好但不在 Windows 计划任务中运行(Batch File running fine if double-clicked but does not run in Windows Scheduled Task)
    问题 我的 C: 驱动器上有一个 archive.pst 文件,我用它在 Outlook 中备份我的电子邮件。 但是我的 C: 每晚都没有备份。 因此,我想将 .pst 文件复制到我的网络驱动器,以便始终对其进行备份。 由于各种原因,我不希望 Outlook 直接从网络驱动器打开 .pst 文件。 因此,我正在尝试创建一个计划任务,每天将我的 .pst 文件复制到网络位置。 如果双击,下面的批处理文件可以完美运行。 如果我尝试运行计划任务,只会创建日志文件。 Outlook 不会关闭,并且不会复制 .pst 文件。 我试过以最高权限运行,但这似乎没有帮助。 任何想法,将不胜感激。 cscript.exe close_outlook.vbs ::This is my VBS Script ::Set Outlook = CreateObject("Outlook.Application") ::Outlook.Quit ping localhost > nul set idrive="\\myserver\drive\\Outlook Files\" set current="C:\myfolder\myuser\Documents\Outlook Files" echo Start Time of Copy: %time% >> %idrive%\Log.txt copy
  • SSD固态盘存储基本原理学习
    SSD固态盘存储原理学习 通常,对于一个存储介质需了解以下相关内容: 数字信息"1"和"0"是如何表示的; 读操作; 写操作; 删除操作; 存储信息单元; 如何编址; 信息存储可靠性; 读写性能; 使用寿命; 存储设备的体系结构; 参考网址:http://www.sandisk.com SSD Academy: http://www.sandisk.com/business-solutions/ssd/academy.aspx the principles of flash operation : http://www.sandisk.com/business-solutions/ssd/movie-3-principles-of-flash-operation---flash-technology-tutorial-.aspx 固态硬盘(Solid State Disk或Solid State Drive),也称作电子硬盘或者固态电子盘,是由控制单元和固态存储单元(DRAM或FLASH芯片)组成的硬盘。   固态硬盘的接口规范和定义、功能及使用方法上与普通硬盘的相同,在产品外形和尺寸上也与普通硬盘一致。由于固态硬盘没有普通硬盘的旋转介质,因而抗震性极佳。其芯片的工作温度范围很宽(-40~85摄氏度)。 SSD工作原理   下面是一个关于NAND闪盘的原理图。从下图我们可以看到
  • Identify CD drive and eject using bat or vbs while in WinPE without external files
    I need to identify the CD drive and eject the tray. This is executed while booted in WinPE, so the WMP eject function is not available. This script will be used on various computer models/configurations. I'm currently using this: For Each d in CreateObject("Scripting.FileSystemObject").Drives CreateObject("Shell.Application").Namespace(17).ParseName("D:\").InvokeVerb("Eject") Next It works, but sometimes it errors and requires user interaction before it ejects. I suspect that it's because of the hardcoded D:\ drive letter, but I could be completely wrong. I need this to work without 3rd party
  • 如何从命令行刷新硬盘和闪存盘(或文件系统)的缓存?(How to flush cache of hard-disk and flash-disk (or filesystem) from command line?)
    问题 我正在写一个备份脚本 将数据复制到备份磁盘。 刷新备份磁盘。 执行哈希完整性检查。 在我过去做sleep(60)等待一分钟,以便内核自动刷新数据之前。 我认为这太过分了,所以现在我尝试使用sudo hdparm -F --verbose /dev/disk但是它报告错误HDIO_DRIVE_CMD(flushcache) failed: Invalid exchange多次HDIO_DRIVE_CMD(flushcache) failed: Invalid exchange 。 我想知道是否有任何标准方法可以将缓存刷新到硬盘。 我认为是因为usb-creator-gtk做到了,而umount做到了。 我正在使用Ubuntu x64 9.10 PS:我试图避免“同步”,因为这个页面说,这是不是安全的。 http://ubuntuforums.org/showthread.php?t=589975 回答1 sync就足够了吗? 编辑:关于您的编辑-您正在尝试避免同步,因为互联网上有人在他的帖子上贴了CYA免责声明? 也许我不知道同步有什么问题,但它本身值得第二篇。 不过,从linux信息页面: sync将内存中缓冲的所有数据写出到磁盘。 这可以包括(但不限于)修改后的超级块,修改后的inode以及延迟的读写。 这必须由内核来实现。 同步程序除了执行“同步”系统调用外什么也不做。
  • 如何使用C ++将包含多个分区的图像写入Windows上的USB闪存驱动器(How to write an image containing multiple partitions to a USB flash drive on Windows using C++)
    问题 在Windows上,您只能在可移动媒体上看到第一个分区。 我想编写一个C ++程序,该程序可以将包含MBR和2个数据分区的图像写入USB闪存驱动器。 我不需要第二个分区在Windows中可见-我只需要能够将此原始映像从Windows / C ++写入USB闪存驱动器,以便稍后在Linux上运行时可以看到第二个分区。 我已经读过有关安装筛选器驱动程序的信息,该筛选器驱动程序最终会将可移动媒体视为固定的,这对于读取非常有用,但是我只想编写此映像,而对用户PC的干扰很小。 我可以从第一个扇区开始访问原始USB驱动器,然后仅写入MBR,然后写入两个数据分区吗? 回答1 如果您有足够的权限执行此操作,则可以使用带有\\.\PhysicalDrive2类的文件名的CreateFile来打开一个句柄以直接将其写入USB驱动器。 您需要找出物理驱动器号。 如果有驱动器号,则可以使用\\?\D:等文件名打开卷句柄,然后使用IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS确定与该卷关联的物理驱动器号。 您可能需要先卸下现有卷(如果有)。 我不确定最好的方法是什么,但是您可以尝试使用IOCTL_VOLUME_OFFLINE。 编辑:这是一些我用于磁盘映像的代码,尽管我不记得我是否曾经在USB磁盘上尝试过它。 公共领域,但不作任何明示或暗示的保证。(查看代码