在PowerShell脚本中调用其他PowerShell脚本

时间:2019-09-14 02:39:15

标签: powershell

我试图让一个主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

它们根本无法正常运行。它们可以单独运行,但不能放在一个主脚本中。

1 个答案:

答案 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