强制批处理文件在运行前加载到内存中

5
我在便携式驱动器的管理员分区中有一个批处理文件,并在驱动器根目录处创建了指向该文件的快捷方式符号链接。该文件的目的是卸载驱动器并将其重新挂载为指定的字母(主要是为了方便)。
当打开文件时,它是相对于当前字母而不是卷标识别码打开的,因此,当卸载发生时,命令处理器不知道下一步该做什么,因为它需要读取文件而不是缓存它。
我可以想到两种可预见的解决方案,但无法弄清楚:
  1. 在执行之前使文件被缓存在RAM中
  2. 使文件相对于卷标识别码而非挂载点运行(尝试使用 {VOLID}\file,其中{VOLID}是卷标识别码,但它找不到该文件,尽管它在那里(导航到{VOLID}\正确打开了目录,但尝试打开文件则不能正确打开文件)。
3个回答

5
尽管其他答案表示这很简单,但将整个批处理脚本缓存到RAM中是很容易的。
您只需要构建一个单独的块,因为块在执行之前会被解析和缓存。
但是块有一些缺点,百分比扩展不起作用,因此您需要使用延迟扩展。
不能使用“调用”和“跳转”命令,因为它们会尝试再次从文件中读取。
(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
)
< p > 这里的 (goto) 2>nul & 看起来很奇怪,但在 StackOverflow:如何制作一个批处理文件删除自身?中有解释。
没有 goto 也可以工作,但是脚本会以错误消息结束。


2
让批处理文件确定它正在运行的位置,参见这里。如果它正在从便携式驱动器运行,则将其复制到永久驱动器位置(例如c:\ temp),然后运行该批处理文件的副本。
运行批处理文件时,没有从RAM中运行的概念。Windows命令处理器始终会返回到.bat文件以运行“下一个”命令。如果您在运行批处理文件时编辑它,则命令处理器将捕获您的更改。

我已经尝试避免这种情况,但如果必要的话,我会这样做。然而,当我从Windows资源管理器运行文件时,进程以及所有子进程在卸载时都会被终止(从命令提示符中不会出现这种情况),因此即使从TEMP运行文件,脚本也永远无法完成。 - Arthur Uzulin

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 /?

请参阅使用Windows批处理文件运行多个命令的单行答案,了解此处使用运算符&运行两个命令delexit的说明,从而避免在处理时出现未预期的错误消息,导致批处理文件被Windows命令解释器删除而打开控制台窗口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接