我是编写.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 专家,远非如此,但我知道您的疑问更多地集中在流程本身的机制上,而不是必要的代码上。
- 进一步阅读:
答案2
是的,有办法在 PowerShell 中完成所有这些操作,无需 .bat/.cmd。但请注意,根据上述交战规则,Stack* 不是脚本编写服务。
您这里有一个项目,在进入下一步之前,应该一步一步地进行,以确保您获得预期的结果。
创建一个脚本...
- 从网站上的文件中获取哈希值
- 从网络下载文件
- 监视完成情况
- 解除文件阻止
- 验证哈希
- 运行安装程序
- 生成成功和失败的报告
…然后,一旦上述所有步骤都经过单独验证,就创建一个新任务,并将脚本分配给它执行
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*'