【发布时间】:2014-07-02 11:29:53
【问题描述】:
我一直在编写一个脚本来安装需要多个安装程序才能正常工作的产品。有些需要安装某些功能,而另一些则是可选的。我的脚本是菜单驱动的,它启用了可选的安装程序并且运行良好。
大部分代码都被重复使用了,我想将它合并到一个 for 循环中,但是我的 PShell-foo 还不是黑带级别。我熟悉多变量 for 循环的 CSV 输入,但认为这可以通过代码中生成的数组来完成。你们哪位大师能训练这个新手吗?
这是当前代码的净化版本:
# Main Level Menu Choices
switch (Read-Host $Main_Prompt)
{
1 {$choice = 1}
2 {$choice = 2}
3 {$choice = 3}
4 {$choice = 4}
5 {$choice = 5}
"q" {$choice = q}
}
if (($choice -eq "q"){
Write-host "Exiting!"
exit
}
# Install 1
if (($choice -eq 1) -or ($choice -eq 5)){
Write-Host "Installing 1"
$1Path = "$InstallSource\Folder1\file.msi"
if (Test-Path $1Path) {
$processInfo = New-Object System.Diagnostics.ProcessStartInfo "msiexec.exe"
$processInfo.arguments = "/i `"$1Path`" /qr ARGUMENTS"
$processMSI = New-Object System.Diagnostics.Process
$processMSI.StartInfo = $processInfo
$processMSI.Start() | Out-Null
$processMSI.WaitforExit()
if ($processMSI.ExitCode -ne 0) {
Write-Host "The Installer generated error code:" $processMSI.ExitCode "Exiting!"
exit
}
}
Else {
Write-host "Installer does not exist. Exiting!"
exit
}
}
# Install 2
if (($choice -eq 2) -or ($choice -eq 5)){
Write-Host "Installing 2"
$2Path = "$InstallSource\Folder2\file.msi"
$processInfo = New-Object System.Diagnostics.ProcessStartInfo "msiexec.exe"
$processInfo.arguments = "/i `"$2Path`" /qr ARGUMENTS"
$processMSI = New-Object System.Diagnostics.Process
$processMSI.StartInfo = $processInfo
# Write-host $ProcessInfo.arguments
$processMSI.Start() | Out-Null
$processMSI.WaitforExit()
if ($processMSI.ExitCode -ne 0) {
Write-Host "The Installer generated error code:" $processMSI.ExitCode "Exiting!"
exit
}
}
# Install 3
if (($choice -eq 3) -or ($choice -eq 5)){
Write-Host "Installing 3"
$3Path = "$InstallSource\Folder3\file.exe"
$processInfo = New-Object System.Diagnostics.ProcessStartInfo $3Path
$processInfo.arguments = "/S /v`" ARGUMENTS`""
$processEXE = New-Object System.Diagnostics.Process
$processEXE.StartInfo = $processInfo
$processEXE.Start() | Out-Null
$processEXE.WaitforExit()
if ($processEXE.ExitCode -ne 0) {
Write-Host "The Installer generated error code:" $processEXE.ExitCode "Exiting!"
exit
}
}
# Install 4
if (($choice -eq 4) -or ($choice -eq 5)){
Write-Host "Checking for the Desktop-Experience Feature"
$DEStatus = Get-WindowsFeature Desktop-Experience
if( $DEStatus.Installed -ne "True" ) {
Write-Host "Installing Desktop-Experience Feature"
Import-Module ServerManager
Add-WindowsFeature -Name Desktop-Experience
}
Write-Host "Installing 4"
$4Path = "$InstallSource\Folder4\file.exe"
$processInfo = New-Object System.Diagnostics.ProcessStartInfo $4Path
$processInfo.arguments = "ARGUMENTS"
$processEXE = New-Object System.Diagnostics.Process
$processEXE.StartInfo = $processInfo
$processEXE.Start() | Out-Null
$processEXE.WaitforExit()
if ($processEXE.ExitCode -ne 0) {
Write-Host "The Installer generated error code:" $processEXE.ExitCode "Exiting!"
exit
}
# Install 5
Write-Host "Installing 5"
$5Path = "$InstallSource\Folder5\file.exe"
$processInfo = New-Object System.Diagnostics.ProcessStartInfo $5Path
$processInfo.arguments = "ARGUMENTS"
$processEXE = New-Object System.Diagnostics.Process
$processEXE.StartInfo = $processInfo
$processEXE.Start() | Out-Null
$processEXE.WaitforExit()
if ($processEXE.ExitCode -ne 0) {
Write-Host "The Installer generated error code:" $processEXE.ExitCode "Exiting!"
exit
}
}
# Install 6
if (($choice -eq 3) -or ($choice -eq 5)){
Write-Host "Installing 6"
$6Path = "$InstallSource\Folder6\file.exe"
$processInfo = New-Object System.Diagnostics.ProcessStartInfo $6Path
$processInfo.arguments = "ARGUMENTS"
$processEXE = New-Object System.Diagnostics.Process
$processEXE.StartInfo = $processInfo
$processEXE.Start() | Out-Null
$processEXE.WaitforExit()
if ($processEXE.ExitCode -ne 0) {
Write-Host "The Installer generated error code:" $processEXE.ExitCode "Exiting!"
exit
}
}
# Install 7
if (($choice -eq 4) -or ($choice -eq 5)){
Write-Host "Installing 7"
$7Path = "$InstallSource\Folder7\file.exe"
$processInfo = New-Object System.Diagnostics.ProcessStartInfo $7Path
$processInfo.arguments = "ARGUMENTS"
$processEXE = New-Object System.Diagnostics.Process
$processEXE.StartInfo = $processInfo
$processEXE.Start() | Out-Null
$processEXE.WaitforExit()
if ($processEXE.ExitCode -ne 0) {
Write-Host "The Installer generated error code:" $processEXE.ExitCode "Exiting!"
exit
}
}
编辑:使用 TheMadTechnician 的代码,我对其进行了简化并运行它以查看发生了什么。下面是测试代码:
$App1 = "Write-host App1"
$App2 = "Write-host App2"
$App3 = "Write-host App3"
$App4 = "Write-host App4"
$App5 = "Write-host App5"
$App6 = "Write-host App6"
$App7 = "Write-host App7"
# Main Level Menu Choices
$Main_Prompt = '
[1] Choice1
[2] Choice2
[3] Choice3
[4] Choice4
[5] Choice5
[q] Quit
'
switch (Read-Host $Main_Prompt)
{
{$_ -eq 1 -or $_ -eq 5} {$ToInstall += $App1}
{$_ -eq 2 -or $_ -eq 5} {$ToInstall += $App2}
{$_ -eq 3 -or $_ -eq 5} {$App3,$App4|%{If(!($ToInstall -contains $_)){$ToInstall += $_}}}
{$_ -eq 4 -or $_ -eq 5} {$App5,$App6,$App7|%{If(!($ToInstall -contains $_)){$ToInstall += $_}}}
{$_ -ieq "q"} {Write-host "Exiting!";Exit}
}
ForEach($App in ($ToInstall | Select -Unique)){
Invoke-Expression $App
}
这是结果(在代码块中,因为我还不能发布图片):
PS C:\temp> .\test.ps1
[1] Choice1
[2] Choice2
[3] Choice3
[4] Choice4
[5] Choice5
[q] Quit
: 5
App1Write-host App2Write-host App3Write-host App4Write-host App5Write-host App6Write-host App7
PS C:\temp>
该块似乎执行了第一个命令,但随后将其余命令打印到屏幕上。我对此非常不满意。
【问题讨论】:
-
如果您不打算按照我提到的方式进行操作,您应该将所有
exit替换为break。除非您喜欢每次去测试脚本时都关闭 ISE。如果你喜欢那种东西...... -
感谢您的提示。我不使用 ISE,但它可能是使用休息的更好方法。
-
好的,你在这里完全改变了上下文。您正在从具有属性的对象到字符串。另外,您完全省略了将 $ToInstall 声明为数组的第一行,因此将其设置为字符串,然后将每个新字符串添加到现有字符串的末尾。
-
我通过将管道移除到“Select -Unique”来使其工作。再次感谢!
标签: powershell