强制批处理文件在运行之前加载到RAM

时间:2016-06-20 23:51:15

标签: windows batch-file command-prompt

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

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

我能想到两种可预见的解决方案,但无法弄清楚:

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

3 个答案:

答案 0 :(得分:3)

尽管有其他答案,但将整批脚本缓存到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的情况下工作,但脚本会以错误消息结束

答案 1 :(得分:2)

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

运行浴室文件时,没有从RAM运行它的概念。 Windows命令处理器将始终返回到' next'的.bat文件。命令运行。如果在批处理文件运行时编辑批处理文件,命令处理器将接收您的更改。

答案 2 :(得分:1)

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命令解释程序在处理时会删除意外的批处理文件。