Windows Powershell脚本使用变量部署多个软件

Windows Powershell脚本使用变量部署多个软件,windows,powershell,configuration,designer,Windows,Powershell,Configuration,Designer,我正在构建一个部署脚本,以便使用ppkg文件在新设备上安装软件 脚本查看哪个驱动器是USB驱动器,并将软件复制到本地临时文件夹,并根据一组变量运行它们,如下所示 我正在努力做的是简化脚本,这样我就不会在页面上重复代码7次,我只想运行一个循环7次,以获取所需的软件。我尝试了一个数组,但我想我还没有完全理解它 这是我到目前为止的脚本,其中包含重复代码: #SOE application Variables #applcation1 CM_client $app1name = "Config Man

我正在构建一个部署脚本,以便使用ppkg文件在新设备上安装软件

脚本查看哪个驱动器是USB驱动器,并将软件复制到本地临时文件夹,并根据一组变量运行它们,如下所示

我正在努力做的是简化脚本,这样我就不会在页面上重复代码7次,我只想运行一个循环7次,以获取所需的软件。我尝试了一个数组,但我想我还没有完全理解它

这是我到目前为止的脚本,其中包含重复代码:

#SOE application Variables

#applcation1 CM_client
$app1name = "Config Manager Client 1706"
$app1skip = "no"
$app1path = "$env:SystemDrive\temp\soe\application_installs\app1\CM_client_inst_1706\"
$app1runcommand = "clientx64.bat"
$app1arguments = ""
#applcation2
$app2name = "Office 2016 Pro Plus"
$app2skip = "no"
$app2path = "$env:SystemDrive\temp\soe\application_installs\app2\O2016\"
$app2runcommand = "setup.exe"
$app2arguments = "/configure configuration.xml"
#log Folder
$datetime = Get-Date -format "yyyy.MM.dd-HH.mm.ss"
$logpath = "$env:ALLUSERSPROFILE\SOEInst_ppkg\$datetime"
New-Item -Path $logpath -ItemType Directory -ErrorAction SilentlyContinue

#Transcript Start
Start-Transcript -Path $logpath\SOE-app-installer-ppkg-$datetime.log

#Timer Function
$pkgremovetime = Get-Date -format "HH:mm:ss"
write-host "Script Start Time - $pkgremovetime"

#Find USB Drive
Write-host Discovering USB Drive

$drives = (GET-WMIOBJECT –query “SELECT * from win32_logicaldisk").DeviceID

foreach ($drive in $drives) {

            $usbdrive = (dir $drive USBIMG.FILE | Select-Object -Unique "USBIMG.FILE")
            if ($usbdrive -match "USBIMG.FILE*") {
                    $datadrive = $drive
                    }
            }

Write-host Found $datadrive is the USB drive

#Copy Applications to Local Drive
Write-Host Creating Installer Folder
New-Item -Path $env:SystemDrive\temp\SOE -ItemType Directory
Copy-Item $datadrive\application_installs $env:SystemDrive\temp\soe -Recurse -Verbose

#Install Applications
#Application 1
    if ($app1skip -eq "no") {
    if ($app1arguments) { #Arguments Variable Populated
        Write-Host Installing Applcation 1 `($app1name`)
        $app1 = Start-Process -Wait -FilePath $app1path$app1runcommand -ErrorAction Continue -ArgumentList $app1arguments -WindowStyle Normal
            if ($app1.ExitCode -eq "0") {
                Write-Host $app1name Installed ok
                } Else {
                    Write-host $app1name install exited with code $app1.ExitCode
                    } 
                }
            }Else { #Argurments Variable Empty
                Write-Host Installing Applcation 1 `($app1name`)
                $app1 = Start-Process -Wait -FilePath $app1path$app1runcommand -ErrorAction Continue -WindowStyle Normal
                if ($app1.ExitCode -eq "0") {
                    Write-Host $app1name Installed ok
                    } Else {
                        Write-host $app1name install exited with code $app1.ExitCode
                }
            }


#Application 2
if ($app2skip -eq "no") {
    if ($app2arguments) { #Arguments Variable Populated
        Write-Host Installing Applcation 2 `($app2name`)
        $app2 = Start-Process -Wait -FilePath $app2path$app2runcommand -ErrorAction Continue -ArgumentList $app2arguments -WindowStyle Normal
            if ($app2.ExitCode -eq "0") {
                Write-Host $app2name Installed ok
                } Else {
                    Write-host $app2name install exited with code $app2.ExitCode
                    } 
                }
            }Else { #Argurments Variable Empty
                Write-Host Installing Applcation 2 `($app2name`)
                $app2 = Start-Process -Wait -FilePath $app2path$app2runcommand -ErrorAction Continue -WindowStyle Normal
                if ($app2.ExitCode -eq "0") {
                    Write-Host $app2name Installed ok
                    } Else {
                        Write-host $app2name install exited with code $app2.ExitCode
                }
            }
#cleanup

Remove-Item $env:SystemDrive\temp\soe -Recurse -Force -Verbose

#get end time
$pkgremovetime_end = Get-Date -format "HH:mm:ss"

#calculate time difference
$timetaken = New-TimeSpan $pkgremovetime $pkgremovetime_end
    if ($timetaken.Seconds -lt 0) {
$Hrs = ($timetaken.Hours) + 23
$Mins = ($timetaken.Minutes) + 59
$Secs = ($timetaken.Seconds) + 59 }
    else {
$Hrs = $timetaken.Hours
$Mins = $timetaken.Minutes
$Secs = $timetaken.Seconds }
$Difference = '{0:00}:{1:00}:{2:00}' -f $Hrs,$Mins,$Secs

#log time difference
write-host "Script End Time - $pkgremovetime_end"
Write-Host "Total time taken $difference"

#Transcript End
Stop-Transcript

我建议你做一个函数,它接受变量。我对你的安装代码做了一个快速的比较,类似的东西应该可以用

function installApplication{
    Param($skip, $arguments, $name, $path, $runcommand)
    if ($skip -eq "no"){
        if ($arguments){
            write-host "Installing Application $appname"
            $app = Start-Process -Wait -FilePath $path$runcommand -ErrorAction....
            if($app.ExitCode -eq "0"){
            ....
            ....
}
依此类推,然后可以使用

installApplication $app1skip $app1arguments $app1name $app1path $app1runcommand
installApplication $app2skip $app2arguments $app2name $app2path $app1runcommand
您的输入参数将按照传入的顺序替换函数参数,或者您可以使用-skip$app1skip分配参数

如果重复同一代码太多次,我建议将其放入diffchecker之类的工具中,将代码放入函数中,并用变量替换所有差异


您可以在此处看到您的代码(仅1天)

您无法将其提取为一个小的代表性示例,而不是一个100多行的代码转储?请为您将其减少,以最好地代表它所做的工作,希望这能让您感到高兴……感谢您的编辑。请在我取下Javascript/HTML代码后停止将其重新格式化。这不是Javascript或HTML。对于常规代码,请使用工具栏上的{}按钮。谢谢。老实说,这看起来更像一个问题,而不是一个一般的问题。我会尝试一下,看起来是一个非常好的解决方案。谢谢。我在我的代码中发现了一些其他问题,并对其进行了清理。我将研究该函数。