【问题标题】:Force batch file to load to RAM before running强制批处理文件在运行前加载到 RAM
【发布时间】:2016-06-20 23:51:15
【问题描述】:

我的便携式驱动器的管理分区中有一个批处理文件,在驱动器的根目录上有一个符号链接到它的快捷方式。该文件的目的是卸载驱动器并将其重新安装为指定的字母(主要是为了方便)。

当文件打开时,它是相对于当前字母而不是卷 ID 打开的,所以自然地,当卸载发生时,命令处理器不知道下一步该做什么,因为它会根据需要读取文件,而不是而不是缓存它。

有两种可以预见但想不通的解决方案:

  1. 在执行前将文件缓存到 RAM 中
  2. 使文件相对于卷 ID 而不是挂载点运行(尝试使用 {VOLID}\file 其中 {VOLID} 是卷 ID,但它无法找到该文件,虽然它在那里(导航到 {VOLID }\ 正确打开了目录,但是尝试打开文件没有正确打开文件。

【问题讨论】:

    标签: windows batch-file command-prompt


    【解决方案1】:

    尽管有其他答案,但将整个批处理脚本缓存到 RAM 是微不足道的。

    您只需要构建一个块,因为块在执行之前会被解析和缓存。

    但是块有一些缺点,百分比扩展不起作用,因此您需要使用延迟扩展。
    callgoto不能使用,因为它们会尝试再次从文件中读取.

    (goto) 2>nul & (
      echo The script is started 
      REM Need to change the directory, else the unmount doesn't work
      c:
      mountvol e: /p
      mountvol g: \\?\Volume{VOLID}\
      dir G:\
      echo The script will end now
      REM Here you need the goto 2>nul hack to avoid an error message
    )
    

    (goto) 2>nul & 在这里看起来很奇怪,但在 SO:How to make a batch file delete itself? 上进行了解释。
    它也可以在没有goto 的情况下工作,但是脚本以错误消息结束

    【讨论】:

      【解决方案2】:

      让批处理文件确定它从哪里运行,参见this。如果它是从便携式驱动器运行的,请将其复制到永久驱动器位置(例如 c:\temp),然后运行该批处理文件的副本。

      运行浴文件时,没有从 RAM 运行它的概念。 Windows 命令处理器将始终返回到 .bat 文件以运行“下一个”命令。如果您在批处理文件运行时对其进行编辑,命令处理器将接收您的更改。

      【讨论】:

      • 我试图避免这种情况,但如果需要,会这样做,但是,当我从 Windows 资源管理器运行文件时,进程以及所有子进程都会在我被杀死时被杀死卸载(不会从 cmd 发生),因此脚本永远不会完成,尽管文件是从 TEMP 运行的。
      【解决方案3】:

      JJF 已经写了正确的答案。无法将批处理文件复制到 RAM 并通知 Windows 命令解释器解释内存中的命令行。可以创建一个 RAM 磁盘,将批处理文件复制到 RAM 磁盘并从那里运行它。但这只会使任务变得比必要的复杂。

      这个注释的批处理代码演示了如何将批处理文件复制到临时文件的目录,并在那里启动它以在单独的 Windows 命令进程中完成处理。

      @echo off
      rem Is the batch file path not the path of directory for temporary files?
      if /I not "%~dp0" == "%TEMP%\" (
      
          rem Copy the batch file to directory for temporary files.
          copy "%~f0" "%TEMP%" >nul
          rem Run the copy in a separate command process with name of the batch
          rem file with extension as window title and exit this batch process.
          start "%~nx0" "%TEMP%\%~nx0"
          goto :EOF
      )
      
      echo The batch file is now running from directory for temporary files.
      echo.
      pause
      
      rem Delete the batch file in directory for temporary files
      rem and exit the command process started for this batch file.
      del "%TEMP%\%~nx0" & exit
      

      用您的批处理代码替换两个echo 命令和pause 命令。

      要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

      • call /? ... 解释 %~dp0(参数 0 的驱动器和路径,即批处理文件本身)和 %~nx0(批处理文件的名称和扩展名)
      • copy /?
      • del /?
      • echo /?
      • exit /?
      • goto /?
      • if /?
      • pause /?
      • rem /?
      • start /?

      另请参阅Single line with multiple commands using Windows batch file 上的回答以了解此处使用的操作员 & 的说明 两次运行两个命令 delexit 从一行读取以避免打开的控制台窗口在批处理文件删除时出现错误消息Windows 命令解释器在处理它时出乎意料。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多