0

该文件main.bat位于StartupWindows 目录中Start Menu。它启动debug.exe,然后它读取一个整数variable(i)并在目录中为自动启动的程序和脚本iteration.txt创建另一个。(i).bat接下来,它递增i+1并将其值重新写入iteration.txt.

只要通过cmd双击执行,脚本就可以正常工作。但是当它在系统重新启动后执行时,它会启动debug.exe文件,增加并覆盖 中的整数值iteration.txt,但不会创建任何.bat文件。

main.bat包含:

@echo off
start "" "%UserProfile%\debug.exe"
SET "MY_PATH=%UserProfile%\iteration.txt"
SET /p VARIABLE=<"%MY_PATH%"
(echo @echo off & echo.start "" "%UserProfile%\debug.exe" & echo.exit /s) > %VARIABLE%.bat
set /A NEW=%VARIABLE% + 1
echo:%NEW%>"%MY_PATH%"
exit /s

如何在从Startup文件夹执行时按预期创建批处理文件?

4

1 回答 1

0

%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup用户登录时启动其中的应用程序列表时,它们会在 Shell 的上下文中启动,并继承它的工作目录。通常,这意味着它们将%SystemRoot%\System32作为其工作目录启动。显然,任何 shell 链接(.lnk 文件)都有自己的“Start In”目录集,shell 将其用作启动事物的工作目录。

综上所述,如果您实际上是在 Startup 文件夹中放置一个 .cmd 文件,那么当它执行时,命令解释器将继承 shell 的默认路径C:\Windows\System32,并且这一行:

(echo @echo off & echo.start "" "%UserProfile%\debug.exe" & echo.exit /s) > %VARIABLE%.bat

将尝试在 System32 目录中创建文件。默认情况下,不能从普通用户会话的上下文中写入该目录,因此该行将因访问被拒绝错误而失败,并且批处理文件将继续运行下一行。

要解决此问题,您需要使用 显式更改到目录cd,或者通过在>重定向符号后包含目录来显式将文件输出到目录。可能最简单的方法是添加一行

cd /d "%~dp0"

在批处理文件的顶部,使其将工作目录和当前驱动器设置为批处理文件所在的任何目录。

于 2021-07-26T00:21:04.337 回答