为什么批处理文件双击执行可以正常执行,但按计划任务执行却失败?

问题描述 投票:0回答:1

Windows 崩溃时,我使用以下内容作为所有打开的文件夹窗口的备份。当我在 Windows 文件资源管理器 中单击它时,效果很好。它创建批处理文件

foldersession.bat
,可用于再次打开文件夹窗口。

@echo off
title create backup of currently open folder windows
setlocal enabledelayedexpansion

powershell  @^(^(New-Object -com shell.application^).Windows^(^)^).Document.Folder.Self.Path >> prevfolderpaths.txt

FOR /F "tokens=*" %%f IN (prevfolderpaths.txt) DO (

    set "var=%%f"
    set "firstletters=!var:~0,2!"

    IF "!firstletters!" == "::" ( ECHO start shell:%%~f >> foldersession.bat) ELSE ( ECHO start "" "%%~f" >> foldersession.bat)
)

del "prevfolderpaths.txt"

例如,创建的

foldersession.bat
看起来像这样:

start "" "C:\Users\sscic\Downloads"  
start "" "C:\Windows\symbolic links\New folder" 
start "" "C:\Users\sscic\Downloads" 

当我通过单击打开主批处理文件时,它运行良好。问题是我尝试使用 Windows 任务计划程序 运行它,以使打开的文件夹 Windows 每隔几分钟备份一次。但这不起作用。它不会产生

foldersession.bat

我还尝试通过

explorer.exe
使用
C:\Users\sscic\explorer.exe "C:\Windows\symbolic links\New folder\foldersave.bat
启动它,但无济于事。这让我完全困惑。

将其作为任务自动执行时不会创建

foldersession.bat

batch-file windows-task-scheduler
1个回答
0
投票

您提交的代码就是我所说的惰性代码。它使用带有相对路径的输出文件,但它没有定义它们的相对位置。当您从任务计划程序运行某些内容时,在任务的配置设置中,您可以输入“开始于”目录的位置,该目录将成为打开时脚本的当前工作目录。

通常,当您未定义当前目录或配置“开始位置”时,默认值将变为

C:\Windows\System32
,我最好的猜测是这就是您的问题。

此外,由于这是一个编程站点,而不是软件配置站点,因此您的代码可以重写以提高效率,不需要中间输出文件,并且只需一行即可完成。

@%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NoProfile -Command "@((New-Object -COMObject Shell.Application).Windows()).Document.Folder.Self.Path | ForEach-Object {If ($_.StartsWith('::')) {Write-Output \"@Start Shell:$_\"} Else {Write-Output \"@Start `\"`\" `\"$_`\"\"}} | Out-File '.\FolderSession.cmd' -Encoding OEM"

在上面的代码中,我将您的

.bat
文件扩展名更改为
.cmd
,因为这是本世纪创建的批处理文件的正确扩展名。

© www.soinside.com 2019 - 2024. All rights reserved.