有没有办法在进程完成操作后运行任务?

有没有办法在进程完成操作后运行任务?

我是编写.bat 文件的专家,我有编写.ps1 文件的经验,我刚刚学会使用它taskschd来创建计划任务。

目前我可以设置一个时间来触发脚本,我知道我可以将触发器定义为用户登录时、系统启动时等,这很容易,但我想知道是否有办法将触发器定义为在给定过程完成时,无论是在taskschd还是在 PowerShell 中。

例如,当下载程序完成文件下载后,使用 PowerShell 运行哈希检查;当资源管理器完成文件夹复制后,在 cmd 中比较两个文件夹;当dism单独的 cmd 完成对该驱动器的格式化后,在 cmd 中使用 Windows 安装到驱动器...

有什么办法可以实现这一点吗?我是否需要在进程运行时创建任务,以便可以使用其 PID,或者我也可以使用其路径和/或名称?在上述场景中,操作完成后,进程正在等待进一步的指令,不再执行任何操作,处于空闲状态,不使用 CPU,也许这可以帮助定义触发器...

答案1

例如,当下载程序完成文件下载后,使用 PowerShell 运行哈希检查;当资源管理器完成文件夹复制后,在 cmd 中比较两个文件夹;当单独的 cmd 完成对该驱动器的格式化后,在 cmd 中使用 dism 将 Windows 安装到驱动器...

有什么方法可以实现这个吗?

我会做的,并且在类似情况下(在 bat/cmd 中)做了很多的,是操作系统变量(setx),但直接在寄存器中读取和写入值,因此,在执行中,可以发送执行状态及其结果。

您可以创建一个逻辑,在脚本执行的每个时刻理解您,并在完成时获取此操作的状态,甚至更新读取的信息以供另一个脚本进行相关的读取和执行。

简而言之,所有操作都可以根据一个或多个正在执行(或称为执行)的脚本读取/写入的值来采取,并且它可以通过使用结果更新每个操作开始/结束后读取的信息来“报告”其状态,包括指出处理日志的方法,甚至在您的情况下,下载、安装、计算哈希值等。

下面我留下了一个简单的例子,其中一个脚本的执行会改变/写入注册表中的值,而另一个会读取这些值。


$Job = {    
    if ((Get-itemproperty -Path 'HKCU:\Environment').Status_Job -eq 'Starting') {

        Write-Host "Status_Job Starting, you can execute your "
        Write-Host "command accordingly the status Starting Status_Job!" ; sleep -M 1500 ; &$Job

      } elseif ((Get-itemproperty -Path 'HKCU:\Environment').Status_Job -eq 'Running') {

        Write-Host "Status_Job Running, you can execute your "
        Write-Host "command accordingly the status Running Status_Job" ; sleep -M 1500 ; &$Job   
       
      } elseif ((Get-itemproperty -Path 'HKCU:\Environment').Status_Job -eq 'Downloading') {
        Write-Host "Status_Job Downloading, you can execute your "
        Write-Host "command accordingly the status Downloading Status_Job" ; sleep -M 1500 ; &$Job   
    
      } elseif ((Get-itemproperty -Path 'HKCU:\Environment').Status_Job -eq 'Done') {

        Write-Host "Status_Job Done, you can execute your "
        Write-Host "command accordingly the status Done Status_Job"

      }
   }

For($i = 1; $i -lt 3; $i++){sleep 1; &$Job}
if ((Get-itemproperty -Path 'HKCU:\Environment').Status_Job) {
     Remove-ItemProperty -Name Status_Job -Path 'HKCU:\Environment' }

  1..20 | ForEach-Object {

    sleep 1; if ($_ -eq 20) {

        Set-ItemProperty -Path "HKCU:\Environment" -Name Status_Job -Value 'Done' -Type MultiString
        $_ ;     sleep -M 250

      } elseif ($_ -eq 15)  {

        Set-ItemProperty -Path "HKCU:\Environment" -Name Status_Job -Value 'Downloading' -Type MultiString
        $_ ;     sleep -M 250

      } elseif ($_ -eq 10)  {

        Set-ItemProperty -Path "HKCU:\Environment" -Name Status_Job -Value 'Running' -Type MultiString
        $_ ;    sleep -M 250

      } elseif ($_ -eq 5)  {

        Set-ItemProperty -Path "HKCU:\Environment" -Name Status_Job -Value 'Running' -Type MultiString
        $_ ;    sleep -M 250

      } elseif ($_ -eq 1){

        Set-ItemProperty -Path "HKCU:\Environment" -Name Status_Job -Value 'Starting' -Type MultiString
        $_ ;    sleep -M 250

      }

   }

我并不是 PowerShell 专家,远非如此,但我知道您的疑问更多地集中在流程本身的机制上,而不是必要的代码上。


  • 进一步阅读:

[√]在 Windows 10 中创建环境变量

[√]设置环境变量 - SETX | 参考:PowerShell

[√]跳转到脚本中的某些位置 | 参考:答案 @by AdamL

答案2

是的,有办法在 PowerShell 中完成所有这些操作,无需 .bat/.cmd。但请注意,根据上述交战规则,Stack* 不是脚本编写服务。

您这里有一个项目,在进入下一步之前,应该一步一步地进行,以确保您获得预期的结果。

创建一个脚本...

  1. 从网站上的文件中获取哈希值
  2. 从网络下载文件
  3. 监视完成情况
  4. 解除文件阻止
  5. 验证哈希
  6. 运行安装程序
  7. 生成成功和失败的报告

…然后,一旦上述所有步骤都经过单独验证,就创建一个新任务,并将脚本分配给它执行

PowerShell 提供了用于执行此操作的 cmdlet,并且它在网络上有很好的文档记录,YouTube视频以及 PowerShell 帮助文件中的内容。使用以下内容整理一些内容,并在遇到问题时与我们联系。

# Get specifics for a module, cmdlet, or function
(Get-Command -Name Get-Help).Parameters
(Get-Command -Name Get-Help).Parameters.Keys
Get-help -Name Get-Help -Examples
Get-help -Name Get-Help -Full
Get-help -Name Get-Help -Online
    
(Get-Command -Name Get-FileHash).Parameters
(Get-Command -Name Get-FileHash).Parameters.Keys
Get-help -Name Get-FileHash -Examples
Get-help -Name Get-FileHash -Full
Get-help -Name Get-FileHash -Online

(Get-Command -Name Get-Process).Parameters
(Get-Command -Name Get-Process).Parameters.Keys
Get-help -Name Get-Process -Examples
Get-help -Name Get-Process -Full
Get-help -Name Get-Process -Online
    
(Get-Command -Name Compare-Object).Parameters
(Get-Command -Name Compare-Object).Parameters.Keys
Get-help -Name Compare-Object -Examples
Get-help -Name Compare-Object -Full
Get-help -Name Compare-Object -Online

Get-Command -Name '*transfer*', '*webrequest*', '*restmethod*', '*unblock*', '*task*', '*performance*'

“PowerShell 下载文件的方法”

“PowerShell 关于工作流程”

“PowerShell 有关作业”

相关内容