为何PowerShell创建的Exchange Online计划任务用双引号无法正常运行?
PowerShell计划任务双引号执行异常的问题解决
你的问题核心是双引号Here-String的变量插值特性导致生成的计划任务脚本不符合预期,进而使任务一直处于Running状态无法完成。单引号Here-String不会自动解析变量,脚本会原样传递给计划任务执行,因此正常;而双引号Here-String会在当前脚本执行时就把变量替换成实际值,若变量值包含特殊字符、空格,或者替换后脚本语法出错,就会导致计划任务执行卡住。
具体修复方案:
- 转义Here-String中的变量:在双引号Here-String里,所有需要留到计划任务执行时才解析的变量,前面加反引号`,避免当前脚本提前插值。
- 修正参数引号转义:移除不必要的双引号转义,改用单引号包裹参数值,或用反引号转义双引号。
- 日志字符串的引号处理:日志行的双引号用反引号转义,避免语法错误。
修正后的$Command代码:
$Command = @" [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12 `$UserName = 'user@site.com' `$PasswordText = Get-Content C:\\Users\\User\\Password\\Secure.txt `$SecurePwd = `$PasswordText | ConvertTo-SecureString `$CredObject = New-Object System.Management.Automation.PSCredential -ArgumentList `$UserName, `$SecurePwd connect-exchangeonline -Credential `$credObject Remove-MailboxFolderPermission -Identity `$To_From_Email -User `$Add_Remove_Email -Confirm:`$false -ErrorAction Ignore Add-MailboxFolderPermission -Identity `$To_From_Email -User `$Add_Remove_Email -AccessRights '$Select_Permission' "`$TriggerDate,`$WhoAmI,`$TaskName,Grant Permissions,`$Add_Remove_Email_Ref,`$To_From_Email_Ref,`$TriggerDate,`$EndTriggerDate,`$Select_Permission,No, No"|Add-Content -Path C:\\Users\\User\\Logs\\Calendar-Scheduled-Tasks-Log.csv "@
额外注意点:
- 计划任务的EndAction参数中,
Unregister-ScheduledTask的命令需要用引号包裹参数,避免$TaskName包含空格时出错:
$EndAction = New-ScheduledTaskAction -Execute "Powershell.exe" -Argument "-WindowStyle Hidden Unregister-ScheduledTask -Taskname `"$TaskName`" -Confirm:`$false;Unregister-ScheduledTask -TaskName `"$TaskName-Remove`" -Confirm:`$false"
- 生成Base64编码前,确保
$Command的语法完全正确,可以先将$Command输出到控制台检查,确认变量都被正确转义,没有提前替换。
内容的提问来源于stack exchange,提问作者Dust Ellse
相关产品推荐
相关产品推荐

