我一直试图设置一个 PowerShell 脚本,作为 Windows Server 2012 R2 服务器上计划任务的一部分运行。如果我从 GUI 手动执行该脚本,该脚本将会运行,但除了一次尝试从任务运行该脚本外,其他所有尝试都失败了。
经过一些故障排除后,我发现如果我将任务设置为“仅在用户登录时运行”并执行该任务,它会运行正常。它会弹出一个 powershell 窗口,运行脚本,然后自行关闭。看来我走在正确的轨道上,我可能已经缩小了问题的范围,但我不知道接下来该怎么做。显然,无论我是否登录,我都希望脚本能够执行。
为了以防万一,这是我正在运行的脚本:
Get-ChildItem C:\somefolder -Recurse|
Where-Object{$_.PsIsContainer}| Sort-Object CreationTime -desc|
Select-Object -Skip 3| Remove-Item -Force
我可以从哪里查看?我已经能够以这种方式从服务器 2008 运行 powershell 脚本而没有任何问题,但我似乎无法破解这个。
编辑:对于设置为启动程序的任务的操作,在程序/脚本下,我有“powershell”,然后有“.\myscript.ps1”作为参数,然后有“c:\”作为启动。
答案1
您可以尝试运行以下命令:
powershell -noprofile -noexit -executionpolicy bypass -file C:\path\script.ps1
还要检查:get-executionpolicy 是否设置为 RemoteSigned
还请检查“无论用户是否登录都运行”。
答案2
最终想出了这个:
问题出在我试图操作网络驱动器上的某个东西。我了解到,即使你已经在 Windows 中映射了驱动器,你必须取消映射并重新映射驱动器作为脚本的一部分,以便通过 PowerShell 脚本以非交互方式操作文件。
以下是我添加到 PowerShell 脚本中以使其正常工作的内容:
$secpasswd = ConvertTo-SecureString "YourPassword" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
Remove-PSDrive –Name “Z”
New-PSDrive –Name “Z” –PSProvider FileSystem –Root “\\192.168.X.X\backup” –Persist -Credential $mycreds
当您登录时,会发生一些与凭据缓存有关的事情,但当您通过任务管理器运行相同的脚本时,这些事情并不会被使用。
非常感谢大家对我这个问题的回答,它真的帮助我最终弄清楚了这个问题,希望这也能帮助其他人。
最后要注意的是,此方法也适用于同一台服务器上的批处理文件。
答案3
您是否尝试过更改 DC 上管理员的 UAC 设置?(最好通过 GPO 执行此操作)有 3 个不同的选项需要更改才能使 Powershel 脚本在 Sheduled Task 中运行。这 3 个 UAC 策略设置可以在以下位置找到计算机配置>>政策>>Windows 设置>>安全设定>>当地政策>>安全选项:-用户帐户控制: Built-i 管理员账户的管理员批准模式 (没有定义的) -用户帐户控制:以管理员批准模式运行所有管理员(已禁用) -用户帐户控制:管理员批准模式下管理员的提升权限提示行为(无需提示即可提升)配置它们,以便当您使用管理员权限帐户执行计划任务时 UAC 不会启动
当然你必须选择“无论用户是否登录,都运行“在您的计划任务配置中的常规选项上。