Powershell 脚本无法在任务计划程序中正确运行

问题描述

我最近创建了一些 PowerShell 代码,它们单独运行或通过命令提示符(或 .bat 文件)运行得非常好。地狱,它也作为 .cmd 文件运行良好。当我创建一个任务计划程序任务以使其自动运行时,结果声称该作业“成功”运行,但文件夹目标中没有任何输出

该脚本的整个目标是查看 Outlook 中的特定子文件夹并查找具有特定名称文件。然后将最新的相关附件输出到特定目的地。

PowerShell 脚本

$olFolderInBox = 6
$limit = (Get-Date).AddDays(-1)
$filepath = "C:\Scripts\attachment Project\Spreadsheets"
$ol = New-Object -com outlook.application;
$ns = $ol.GetNamespace("MAPI");
$acct = $ns.GetDefaultFolder($olFolderInBox)
$targetfolder = $acct.Folders | where-object { $_.name -eq "Training" }
$targetfolder.Items | foreach {
    if ($_.ReceivedTime -ge $limit) { 
            $_.attachments |
            foreach {
                Write-Host "attached file: ",$_.filename
                If ($_.filename -match 'SessionCompletions' -or $_.filename -match 'Certifications'){
                    $_.saveasfile((Join-Path $filepath $_.FileName))
                    $ol.quit()
                } 
            } 
    }
}

我尝试了各种方法来让 Task Scheduler 中的 Task 正常工作,但到目前为止似乎没有任何帮助。首先,我尝试使用基本的 bat 文件来运行任务。请注意,这种基本格式适用于我设置为通过 bat 文件运行的许多其他 PowerShell 相关任务。

基本蝙蝠脚本

powershell -file extract-spreadsheets.ps1

现在有时我还需要包含一个 -executionpolicy 参数,但遗憾的是它在这种情况下不起作用。

稍微复杂一点的脚本

Powershell.exe -executionpolicy RemoteSigned -File  "C:\Scripts\attachment Project\extract spreadsheets.ps1"

注意:我确保计算机上的 get-executionpolicy 是 / 设置为 RemoteSigned。我也试过无限制

我还尝试了更复杂/不同的方法,例如 . . .

更复杂的脚本

@ECHO OFF
SET ThisScriptsDirectory=C:\Scripts\David attachment Project\
SET PowerShellScriptPath=%ThisScriptsDirectory%extract-spreadsheets.ps1
PowerShell -noprofile -ExecutionPolicy RemoteSigned -Command "& {start-process PowerShell -ArgumentList '-noprofile -ExecutionPolicy RemoteSigned -File ""%PowerShellScriptPath%""' -Verb RunAs}";

我什至尝试获取 .cmd 文件并尝试在 Task Scheduler 中使用它:

@@:: This prolog allows a PowerShell script to be embedded in a .CMD file.
@@:: Any non-PowerShell content must be preceeded by "@@"
@@setlocal
@@set POWERSHELL_BAT_ARGS=%*
@@if defined POWERSHELL_BAT_ARGS set POWERSHELL_BAT_ARGS=%POWERSHELL_BAT_ARGS:"=\"%
@@PowerShell -Command Invoke-Expression $('$args=@(^&{$args} %POWERSHELL_BAT_ARGS%);'+[String]::Join(';',$((Get-Content '%~f0') -notmatch '^^@@'))) & goto :EOF

$olFolderInBox = 6
$limit = (Get-Date).AddDays(-1)
$filepath = "C:\Scripts\attachment Project\Spreadsheets"
$ol = New-Object -com outlook.application;
$ns = $ol.GetNamespace("MAPI");
$acct = $ns.GetDefaultFolder($olFolderInBox)
$targetfolder = $acct.Folders | where-object { $_.name -eq "Training" }
$targetfolder.Items | foreach {
    if ($_.ReceivedTime -ge $limit) { 
            $_.attachments |
            foreach {
                Write-Host "attached file: ",$_.filename
                If ($_.filename -match 'SessionCompletions' -or $_.filename -match 'Certifications'){
                    $_.saveasfile((Join-Path $filepath $_.FileName))
                    $ol.quit()
                } 
            } 
    }
}

就任务计划程序而言,我尝试了很多东西。开始 。 . .

对于程序/脚本,我尝试了 bat、cmd 和 PowerShell 的各种相对和显式目标/路径。

一些例子:

  1. Powershell.exe(同样,我也完成了完整路径)
  2. C:\Scripts\attachment Project\Training_Reports.bat
  3. Training_Reports.bat
  4. C:\Scripts\attachment Project\extract-spreadsheets.cmd

注意:我已经添加了上面的程序/操作,带引号和不带引号。

同样,更令人沮丧的是 Training_Reports.bat 的基本格式,其中 start in (optional) 字段为:

C:\Scripts\attachment Project or C:\Scripts\attachment Project\

使用过我以这种格式设置的所有其他脚本/任务!

我尝试了许多执行策略的参数,例如 RemoteSignedBypassUnrestricted。我添加了其他参数,例如:-noprofile、-noninteractive、-File、-command、-Nologo 等。

参数字段在任务计划程序中的外观示例:

-ExecutionPolicy Bypass -File "C:\Scripts\attachment Project\extract-spreadsheets.ps1"
-Nologo -NonInteractive -ExecutionPolicy RemoteSigned -File "C:\Scripts\attachment Project\extract-spreadsheets.ps1"
-noprofile -ExecutionPolicy Unrestricted -Command "C:\Scripts\attachment Project\extract-spreadsheets.ps1"

我尝试使用各种帐户来“运行任务”。

  1. 我的域帐户(我的帐户是全局域管理员并且具有 完全权限)
  2. 本地管理员帐户
  3. 一个管理员帐户
  4. 我什至尝试过 SYstem

以上帐户均未更改结果。我查看过的其他设置,人们声称可能会干扰 Tasks。

  1. 关闭'仅当计算机使用交流电源时才启动任务'
  2. 运行任务无论用户是否登录
  3. 也在用户登录时运行
  4. 将其设置为“最高权限
  5. 我尝试在“配置”下拉菜单中运行任务 Windows 10Windows 7/Server 2008

我尝试过的其他事情:

  1. 最初的 PowerShell 脚本已映射驱动器目标。我更改了代码以使用 C 驱动器位置。
  2. 明确授予该用户帐户对 涉及的目录。
  3. 将涉及的目录的所有权更改为同一用户
  4. 将 ps1、cmd、bat、outlook.exe 文件的安全权限更改为始终以管理员身份运行。
  5. 尝试在 Outlook 运行但未运行的情况下运行脚本。 注意:手动运行它不管 Outlook 是否正在运行。

为什么 Task Scheduler 中的这个任务没有正确输出

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)