问题描述
我最近创建了一些 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 的各种相对和显式目标/路径。
一些例子:
- Powershell.exe(同样,我也完成了完整路径)
- C:\Scripts\attachment Project\Training_Reports.bat
- Training_Reports.bat
- C:\Scripts\attachment Project\extract-spreadsheets.cmd
注意:我已经添加了上面的程序/操作,带引号和不带引号。
同样,更令人沮丧的是 Training_Reports.bat 的基本格式,其中 start in (optional) 字段为:
C:\Scripts\attachment Project or C:\Scripts\attachment Project\
使用过我以这种格式设置的所有其他脚本/任务!
我尝试了许多执行策略的参数,例如 RemoteSigned、Bypass 和 Unrestricted。我添加了其他参数,例如:-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"
我尝试使用各种帐户来“运行任务”。
以上帐户均未更改结果。我查看过的其他设置,人们声称可能会干扰 Tasks。
- 关闭'仅当计算机使用交流电源时才启动任务'
- 运行任务无论用户是否登录
- 也在用户登录时运行
- 将其设置为“最高权限”
- 我尝试在“配置”下拉菜单中运行任务 Windows 10 和 Windows 7/Server 2008。
我尝试过的其他事情:
- 最初的 PowerShell 脚本已映射驱动器目标。我更改了代码以使用 C 驱动器位置。
- 明确授予该用户帐户对 涉及的目录。
- 将涉及的目录的所有权更改为同一用户。
- 将 ps1、cmd、bat、outlook.exe 文件的安全权限更改为始终以管理员身份运行。
- 尝试在 Outlook 运行但未运行的情况下运行脚本。 注意:手动运行它不管 Outlook 是否正在运行。
为什么 Task Scheduler 中的这个任务没有正确输出?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)