1- Suspensórios encaracolados.
Existem muitos pares desnecessários deles. Confira a diferença que eles podem fazer:
PS C:\> Write-Host "foo"
foo
PS C:\> {Write-Host "foo"}
Write-Host "foo"
As seções repetitivas if/else
e Get-ItemProperty
de seu código são sempre agrupadas em um par de chaves. Remova esses pares extras. Eles são a causa do seu código aparecer na saída do console. Parece que eles são o resultado de colar o conteúdo da função desde o início do script. Mais algumas informações sobre chaves / parênteses / parênteses: link
2- Isso é subjetivo.
Uma dica geral: melhore a consistência do recuo. O código de resolução de problemas pode ser difícil. Solução de problemas no código confuso é mais difícil. Facilite as coisas melhorando a legibilidade enquanto você escreve.
Por exemplo, as chaves extras do bloco de código que mencionei ao responder sua primeira pergunta poderiam ter sido mais facilmente identificadas se o recuo tivesse sido mantido de forma mais consistente.
O bloco original (redigido):
{
if ([IntPtr]::Size -eq 4) {
$regpath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*'
}
else {
$regpath = @(
'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*'
'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
)
}
...
}
Desta vez com melhor recuo:
{
if ([IntPtr]::Size -eq 4) {
$regpath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*'
}
else {
$regpath = @(
'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*'
'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
)
}
...
}
O maior fator que contribui para a confusão neste script é o uso repetido deste bloco de código. O script começa com uma função. Isso é ótimo, porque você estará chamando o conteúdo da função várias vezes. É para isso que servem as funções. No entanto, o conteúdo da função está sendo chamado repetidamente em todo o script. Não há necessidade de definir continuamente a variável $regpath
e consultá-la com Get-ItemProperty
. Isto é o que sua função faz. Remover esses blocos corta seu código pela metade.
Você está certo - loops e arrays ajudariam seu código de várias maneiras. Mantendo sua função, você pode percorrer cada aplicativo com algo assim:
# the index of each App matches the installer name
$apps = @('Google Earth','Google Chrome','FireFox','Notepad++','Adobe Reader','Office')
$name = @('googleearthpro','googlechrome','firefox','notepadplus','adobereader','office365business')
foreach($app in $apps) {
$result = Get-InstalledApps | Where-Object { $_.DisplayName -like $app }
if($result -eq $null) {
# get the index for the installer for this app
$i = $apps.IndexOf($app)
Write-Host "$app not found. Installing" $name[$i]
(cinst $name[$i] -y)
}
}