为什么我的屏幕截图功能不能用作作业

时间:2016-11-02 12:30:41

标签: powershell jobs

我在Job中有一个函数,它带有一个截图。脚本本身由Taskscheduler作为域管理员执行。我还检查了#34;以最高权限运行"。

作业应该做一个截图,然后发送一封电子邮件,但这两件事都不会发生。我也没有看到错误信息(也许是因为它是后台工作?)。也许电子邮件没有被发送,因为它想要将屏幕截图附加到电子邮件,但不能因为截图没有创建。

为什么我的功能没有截屏?域管理员具有写入目标的权限。当我在start-job之外运行该功能时,会创建屏幕截图。如果我有start-job内的功能它没有被创建,如果脚本是通过Taskscheduler启动或手动启动并不重要。

我错过了什么?

以下代码启动作业并截取屏幕截图:

Start-Job -Name LogikWebserverWatch {

    function Take-Screenshot([string]$outfile) 
    {
    [int]$PrtScrnWidth = (gwmi Win32_VideoController).CurrentHorizontalResolution
    [int]$PrtScrnHeight = (gwmi Win32_VideoController).CurrentVerticalResolution
    $bounds = [Drawing.Rectangle]::FromLTRB(0, 0, $PrtScrnWidth, $PrtScrnHeight)
    $bmp = New-Object Drawing.Bitmap $bounds.width, $bounds.height
    $graphics = [Drawing.Graphics]::FromImage($bmp)
    $graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size)
    $bmp.Save($outfile)
    $graphics.Dispose()
    $bmp.Dispose()
    }

    while ((Get-Process LogikWebserver).Responding) {sleep -Milliseconds 50}

    if (!(Get-Process LogikWebserver).Responding) {
    Try{

        $utf8 = New-Object System.Text.utf8encoding
        $datetime = (get-date).ToString('yyyyMMdd-HHmmss')
        Take-Screenshot -outfile C:\Install\LogikWebserverErrorReporting\Screenshot-$datetime.png
        # some more code [...]
    } Catch {  some more code [...] }
}}

2 个答案:

答案 0 :(得分:1)

The documentations说:

  

Windows PowerShell后台作业运行命令而不与当前会话交互。

因此,您可能必须在工作中加载所需的程序集才能运行。

当我尝试上面的代码时,它只在作业外运行时创建了一个屏幕截图(如您所述),但是将此行添加到Start-Job ScriptBlock的顶部会导致其工作从工作中也是如此:

[Reflection.Assembly]::LoadWithPartialName("System.Drawing")

或者,由于以上情况现已被删除:

[System.Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Drawing.dll")

或者

Add-Type "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Drawing.dll"

请注意,在从计划任务运行时,我没有对此进行过测试。

答案 1 :(得分:0)

不要使用功能。只需在脚本块中编写功能代码,如下所示:

Start-Job -Name LogikWebserverWatch {
    Add-Type -AssemblyName "System.Drawing"
    [int]$PrtScrnWidth = (gwmi Win32_VideoController).CurrentHorizontalResolution
    [int]$PrtScrnHeight = (gwmi Win32_VideoController).CurrentVerticalResolution
    $bounds = [Drawing.Rectangle]::FromLTRB(0, 0, $PrtScrnWidth, $PrtScrnHeight)
    $bmp = New-Object Drawing.Bitmap $bounds.width, $bounds.height
    $graphics = [Drawing.Graphics]::FromImage($bmp)
    $graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size)
    $bmp.Save($outfile)
    $graphics.Dispose()
    $bmp.Dispose()
    }

    while ((Get-Process LogikWebserver).Responding) {sleep -Milliseconds 50}

 if (!(Get-Process LogikWebserver).Responding) {
    Try{

        $utf8 = New-Object System.Text.utf8encoding
        $datetime = (get-date).ToString('yyyyMMdd-HHmmss')
        Take-Screenshot -outfile C:\Install\LogikWebserverErrorReporting\Screenshot-$datetime.png
        # some more code [...]
    } Catch {  some more code [...] }
}