DckWB
@DckWB

Скрипт PS скачивания и установки BGInfo, упростить if(Если)?

Добрый день камрады, есть код PS для скачивания и установки BGInfo c сайта, мне кажется здесь много if на проверку директории \BGInfo, на проверку скачанного архива \BGInfo\BGInfo.zip, проверка разрядности системы.
Если не сделать проверку \BGInfo, архив не скачается. Если не сделать проверку скачанного архива, он будет каждый раз скачиваться.

if(!(test-path "$adms\BGInfo")) {
	New-Item -Path "$adms\BGInfo" -ItemType Directory
	Invoke-WebRequest "https://download.sysinternals.com/files/BGInfo.zip" -outfile "$adms\BGInfo\BGInfo.zip"
	}
	Expand-Archive -path "$adms\BGInfo\BGInfo.zip" -destinationpath "$adms\BGInfo" -force
if ((Get-WmiObject win32_operatingsystem | select osarchitecture).osarchitecture -like "64*")
	{
	C:\Admins\Add\BGInfo\Bginfo64.exe C:\Admins\Add\BGInfo\PIT.bgi /silent /timer:00 /nolicprompt
	}
else
	{
	C:\Admins\Add\BGInfo\Bginfo.exe C:\Admins\Add\BGInfo\PIT.bgi /silent /timer:00 /nolicprompt
	}


Может можно как-то упростить его или сделать по-другому, буду рад помощи или подсказке по логике кода)
Или предложите свой вариант

P.S.
Извиняюсь за стиль кода
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 2
@MaxKozlov
Так вы хотите таки чтобы не скачивался по новой или вам всё равно ?

Скачивать можно в $env:temp, тогда проверять не придётся.

Папку для распаковки создавать с ключом -Force тогда не будет ругаться на её наличие

Если качать не хочется, сразу проверять существование файла, а не папки

проверку на битность можно вынести в начало, чуть упростить и использовать потом в имени файла для проверки и запуска

$bits = (Get-WmiObject win32_operatingsystem).OSArchitecture -replace '\D+'

и потом прямо в имя подставлять через if или из хеша, например, как нравится
$filename = "C:\Admins\Add\BGInfo\Bginfo" + (if ($bits -eq '64) { '64' } else { '' } ) + ".exe"
$filename = "C:\Admins\Add\BGInfo\Bginfo" + @{'64'=64; '32'=32 }[$bits] + ".exe"

if (test-path $filename) .....


А можно ещё качать со своей сети, где держать сразу два архива для разных битностей с соответствующим файлом внутри и с названием bginfo32/bginfo64 чтобы ещё проще было
Ещё можно битность определять по наличию переменных окружения, а не через wmi-так быстрее будет
Ответ написан
DckWB
@DckWB Автор вопроса
Спасибо, взял на вооружение

$bits = (Get-WmiObject win32_operatingsystem).OSArchitecture -replace '\D+'
$bginf = "$adms\BGInfo\BGInfo" + @{'64'=64; '32'=32}[$bits] + ".exe"
if (!(test-path $bginf))
{
New-Item -Path "$adms\BGInfo" -ItemType Directory
Invoke-WebRequest "https://download.sysinternals.com/files/BGInfo.zip" -outfile "$adms\BGInfo\BGInfo.zip"
Expand-Archive -path "$adms\Bginfo\BGInfo.zip" -destinationpath "$adms\BGInfo" -force
Remove-Item "$adms\BGInfo\BGInfo.zip" -force
}
& "$bginf" "$adms\BGInfo\PIT.bgi" /silent /timer:00 /nolicprompt

Переменную $adms задаёте на своё усмотрение

Что получается - проверяется папка на наличие .exe файла исходя из разрядность системы, если файл отсутствует то:
  • Создаётся директория
  • Скачивается архив с сайта
  • Распаковывается в данную директорию
  • Удаляется архив
  • И запускается утилита с ключами
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы