我试图让一个主PowerShell脚本在等待30-60秒以确保任务完成的同时运行所有其他脚本。我尝试的所有其他操作都不会停止/等待第一个脚本及其过程完成,然后再同时浏览所有其他脚本,并且会导致自动重启。
主脚本,以管理员身份运行:
$LogStart = 'Log '
$LogDate = Get-Date -Format "dd-MM-yyy-hh-mm-ss"
$FileName = $LogStart + $LogDate + '.txt.'
$scriptList = @(
'C:\Scripts\1-OneDriveUninstall.ps1'
'C:\Scripts\2-ComputerRename.ps1'
);
Start-Transcript -Path "C:\Scripts\$FileName"
foreach ($script in $scriptList) {
Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-Command '& $script'"
Write-Output "The $script is running."
Start-Sleep -Seconds 30
}
Write-Output "Scripts have completed. Computer will restart in 10 seconds."
Start-Sleep -Seconds 10
Stop-Transcript
C:\Scripts\3-Restart.ps1
1-OneDriveUninstall.ps1
:
Set-ItemProperty -Path REGISTRY::HKEY_LOCAL_MACHINE\Software\Microsoft\windows\CurrentVersion\Policies\System -Name ConsentPromptBehaviorAdmin -Value 0
taskkill /f /im OneDrive.exe
C:\Windows\SysWOW64\OneDriveSetup.exe /uninstall
2-ComputerRename.ps1
:
$computername = Get-Content env:computername
$servicetag = Get-WmiObject Win32_Bios |
Select-Object -ExpandProperty SerialNumber
if ($computername -ne $servicetag) {
Write-Host "Renaming computer to $servicetag..."
Rename-Computer -NewName $servicetag
} else {
Write-Host "Computer name is already set to service tag."
}
日志文件显示:
脚本已启动,输出文件为C:\ Scripts \ Log 13-09-2019-04-28-47.txt。
C:\ Scripts \ 1-OneDriveUninstall.ps1正在运行。
C:\ Scripts \ 2-ComputerRename.ps1正在运行。
脚本已完成。电脑将在10秒后重新启动。
Windows PowerShell脚本结束
结束时间:20190913162957
它们根本无法正常运行。它们可以单独运行,但不能放在一个主脚本中。
答案 0 :(得分:1)
PowerShell可以直接从其他PowerShell脚本运行PowerShell脚本。唯一需要这样做的时间Start-Process
是当您想以提升的权限运行被调用的脚本时(由于父脚本已经在提升的权限下运行,因此这里不需要)。
这应该满足:
foreach ($script in $scriptList) {
& $script
}
以上代码将按顺序运行脚本(即,仅在上一个脚本终止后才启动下一个脚本)。如果要并行运行脚本,则规范方法是使用background jobs:
$jobs = foreach ($script in $scriptList) {
Start-Job -ScriptBlock { & $using:script }
}
$jobs | Wait-Job | Receive-Job