Windows 10任务计划程序中的Powershell脚本无法启动Chrome

时间:2020-01-15 21:08:48

标签: windows powershell scripting scheduled-tasks

我制作了一个小的Powershell脚本“ Start.ps1”,该脚本在Windows启动时启动了一些网站。当我手动启动它时,所有已配置的网站都在Chrome中启动。但是,当我使用任务计划程序运行它时,任务会运行,但是Chrome无法启动。

schtasks /create /tn "Start" /sc onstart /delay 0000:30 /rl highest /ru system /tr "powershell.exe -file 'C:\Users\myuser\Google Drive\Home\Start.ps1'"

我还在我的powershell脚本中添加了一些日志,因此我确定脚本已启动:

Function Write-Log {
  Param (
    [parameter(Mandatory=$True,HelpMessage='Log output')][string]$Log,
    [parameter(Mandatory=$True,HelpMessage='Log severity')][ValidateSet('Debug', 'Info', 'Warning', 'Error', 'Unknown')][string]$Severity,
    [parameter(Mandatory=$True,HelpMessage='Log message')][string]$Message
  )
  $Now = Get-Date -Format 'yyyy-MM-dd HH:mm:ss,fff'
  $LocalScriptName = Split-Path -Path $myInvocation.ScriptName -Leaf
  If ( $Log -eq 'Verbose' ) {
    Write-Verbose -Message ('{0}: {1}: {2}: {3}' -f $Now, $LocalScriptName, $Severity, $Message)
  }
  ElseIf ( $Log -eq 'Debug' ) {
    Write-Debug -Message ('{0}: {1}: {2}: {3}' -f $Now, $LocalScriptName, $Severity, $Message)
  }
  ElseIf ( $Log -eq 'Output' ) {
    Write-Verbose -Message ('{0}: {1}: {2}: {3}' -f $Now, $LocalScriptName, $Severity, $Message)
  }
  ElseIf ( $Log -match '^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])(?::(?<port>\d+))$' -or $Log -match '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' ) {
    $IpOrHost = $log.Split(':')[0]
    $Port = $log.Split(':')[1]
    If ( $IpOrHost -match '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' ) {
      $Ip = $IpOrHost
    }
    Else {
      $Ip = [Net.Dns]::GetHostAddresses($IpOrHost)[0].IPAddressToString
    }
    Try {
      $LocalHostname = ([Net.Dns]::GetHostByName((& "$env:windir\system32\hostname.exe")).HostName).tolower()
      $JsonObject = (New-Object -TypeName PSObject | 
        Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue logsource -InputObject $LocalHostname | 
        Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue hostname -InputObject $LocalHostname | 
        Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue scriptname -InputObject $LocalScriptName | 
        Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue logtime -InputObject $Now | 
        Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue severity_label -InputObject $Severity | 
      Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue message -InputObject $Message ) 
      If ( $psversiontable.psversion.major -ge 3 ) {
        $JsonString = $JsonObject | ConvertTo-Json
        $JsonString = $JsonString -replace "`n",' ' -replace "`r",' '
      }
      Else {
        $JsonString = $JsonObject | ConvertTo-Json2
      }               
      $Socket = New-Object -TypeName System.Net.Sockets.TCPClient -ArgumentList ($Ip,$Port) 
      $Stream = $Socket.GetStream() 
      $Writer = New-Object -TypeName System.IO.StreamWriter -ArgumentList ($Stream)
      $Writer.WriteLine($JsonString)
      $Writer.Flush()
      $Stream.Close()
      $Socket.Close()
    }
    Catch {
      Write-Verbose -Message ("{0}: {1}: Error: Something went wrong while trying to send message to logserver `"{2}`"." -f $Now, $LocalScriptName, $Log)
    }
    Write-Verbose -Message ('{0}: {1}: {2}: Ip: {3} Port: {4} JsonString: {5}' -f $Now, $LocalScriptName, $Severity, $Ip, $Port, $JsonString)
  }
  ElseIf ($Log -match '^((([a-zA-Z]:)|(\\{2}\w+)|(\\{2}(?:(?:25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)(?(?=\.?\d)\.)){4}))(\\(\w[\w ]*))*)') {
    If (Test-Path -Path $Log -pathType container){
      Write-Host ('{0}: {1}: Error: Passed Path is a directory. Please provide a file.' -f $Now, $LocalScriptName)
      Exit 1
    }
    ElseIf (!(Test-Path -Path $Log)) {
      Try {
        $Null = New-Item -Path $Log -ItemType file -Force   
      } 
      Catch { 
        $Now = Get-Date -Format 'yyyy-MM-dd HH:mm:ss,fff'
        Write-Host ("{0}: {1}: Error: Write-Log was unable to find or create the path `"{2}`". Please debug.." -f $Now, $LocalScriptName, $Log)
        exit 1
      }
    }
    Try {
      ('{0}: {1}: {2}: {3}' -f $Now, $LocalScriptName, $Severity, $Message) | Out-File -filepath $Log -Append   
    }
    Catch {
      Write-Host ("{0}: {1}: Error: Something went wrong while writing to file `"{2}`". It might be locked." -f $Now, $LocalScriptName, $Log)
    }
  }
}

$Logfile="c:\Tempo\Start.log"
Write-Log $Logfile Info "Initiating Chrome Site Startup"
Start-Process -FilePath "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
Start-Process -FilePath "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -ArgumentList "https://outsideit.net"
Start-Process -FilePath "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -ArgumentList "https://psychologischezorgopmaat.be"
Start-Process -FilePath "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -ArgumentList "https://github.com"
Start-Process -FilePath "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -ArgumentList "https://gitlab.com"
Start-Process -FilePath "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -ArgumentList "http://localhost:9200"
Start-Process -FilePath "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -ArgumentList "http://localhost:5601"
Write-Log $Logfile Info "Finalizing Chrome Site Startup"

如何在Task Scheduler中进行这项工作?我尝试使用SYSTEM和我自己的用户以及“以最高特权运行”选项来运行它。

1 个答案:

答案 0 :(得分:1)

始终在手动运行计划任务时对其进行测试(Scheduled Tasks-右键单击任务,然后Run)。在这种情况下,继续进行测试,以在启动计算机时(或在任何时候,取决于触发器)是否按预期工作。

当我使用SYSTEM用户帐户通过cmd导入您的任务时,默认设置为“ 运行是否登录用户”。如果我尝试手动运行它,该脚本将无法启动。 然后,我将用户更改为我的帐户,将选项更改为“ 仅在用户登录后才运行”,这为我解决了该问题(之前也有很多次)。使用SYSTEM用户时,我无法更改此选项。

scheduled task settings