为互联网的聪明人干杯。
通过 MDT 部署不同的 Windows 版本和软件。 其中一个软件是监控软件。监控软件提供商为我的客户的每个位置提供了一个 MSI 文件,我可以安装该文件来直接为其分配一台机器。 所以我构建了两个 Powershell 脚本。一个脚本仅位于更安全的服务器上,它将所有安装程序收集并放入 NAS 上的文件夹中。一个脚本是供操作员(实习生)通过 MDT 将操作系统部署到机器上的。该脚本由 MDT TaskSequenz 调用,操作员会收到一个提示,其中包含一个包含所有客户及其位置的表,他们可以从中选择当前准备的客户机器。
该脚本从我的 NAS 调用 MSI 文件。有时它会正确执行并安装监控软件,有时却不会。如果没有,它只会启动 MSIEXEC,弹出安装 Windows 并在一秒钟左右后将其关闭。 MSIEXEC 不会显示任何错误,也不会返回 Powershell。
$vtmp=($folders | Where-Object ListenID -EQ $inp1 | Select-Object Kunde,Standorte)
if($vtmp.Standorte -gt 1){
$trash=@()
$i2=1
foreach($location in $(Get-ChildItem "$($path)\$($vtmp.Kunde)"-Recurse -Directory)){
$addtrash=@{
ListenID=$i2++
Standort="$($location.Name)"
}
$trash += New-Object -TypeName psobject -Property $addtrash
}
$trash | Format-Table
$inp2=Read-Host "Select the desired Location"
## check if human input trash or usable information
while ($trash.ListenID -notcontains $inp2){
write-host -BackgroundColor Red -ForegroundColor Yellow "The entered ID is not conaited in the above list. Try again"
if($inp2 -imatch '\d[a-zA-Z]*' -or '[a-zA-Z]')
{
Write-Host "You entered LETTERS."
Write-Host -ForegroundColor Red "DONT do that."
write-Host "Only numbers listed above are allowed"
Write-Host ""
}
$inp2=Read-Host "Enter the ID of the desired Organisation"
}
##
$vtmp2=($trash | Where-Object ListenID -eq $inp2|Select-Object Standort)
$msipath=((Get-ChildItem "$path\$($vtmp.kunde)\$($vtmp2.Standort)"-File "*.msi").FullName)
}
else{
((get-childitem "$path\$($vtmp.Kunde)\" -File "*.msi" -Recurse).FullName)
}
start-process msiexec.exe -ArgumentList "/i $msipath /passive /norestart -log C:\Windows\Temp\Monitoring.log" -wait
对于所有不会说德语的人,简短翻译:
(如屏幕截图,因为否则它不可读,或者我不擅长格式化文本) MSI执行日志
感谢您的评论 Theo 和 mklement0 我发现了我的错误。 我忘记在
$msipath
的ELSE条件中设置if($vtmp.Standorte -gt 1)
。我确实组装了路径,但从未将其放入 $msipath
变量中。因此脚本尝试访问尚未设置的路径。由于只有一个位置的客户要多得多,因此脚本很少需要走“多个位置”路径。
我们在机器上(作为脚本独立)和 MDT 部署中对其进行了多次测试。
现在工作得很好。有时“只见树木,不见森林