mirror of
https://github.com/bin456789/reinstall.git
synced 2025-01-18 20:39:14 +08:00
core: 支持无 wmic 下运行
This commit is contained in:
parent
4305427b77
commit
823046b6bf
@ -14,5 +14,8 @@ end_of_line = crlf
|
|||||||
[*.{bat,cmd,ps1}]
|
[*.{bat,cmd,ps1}]
|
||||||
end_of_line = crlf
|
end_of_line = crlf
|
||||||
|
|
||||||
|
[*.ps1]
|
||||||
|
charset = utf-8-bom
|
||||||
|
|
||||||
[*.{yml,yaml}]
|
[*.{yml,yaml}]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
@ -31,12 +31,6 @@ if not exist %tmp% (
|
|||||||
md %tmp%
|
md %tmp%
|
||||||
)
|
)
|
||||||
|
|
||||||
rem 24h2 默认禁用了 wmic
|
|
||||||
where wmic >nul 2>nul
|
|
||||||
if errorlevel 1 (
|
|
||||||
DISM /Online /Add-Capability /CapabilityName:WMIC
|
|
||||||
)
|
|
||||||
|
|
||||||
rem 检查是否国内
|
rem 检查是否国内
|
||||||
if not exist %tmp%\geoip (
|
if not exist %tmp%\geoip (
|
||||||
rem 部分地区 www.cloudflare.com 被墙
|
rem 部分地区 www.cloudflare.com 被墙
|
||||||
@ -70,19 +64,34 @@ if not exist "%tags%" (
|
|||||||
rem wmic os get osarchitecture 显示中文
|
rem wmic os get osarchitecture 显示中文
|
||||||
rem wmic ComputerSystem get SystemType 显示英文
|
rem wmic ComputerSystem get SystemType 显示英文
|
||||||
|
|
||||||
for /f "tokens=2 delims==" %%a in ('wmic os get BuildNumber /format:list ^| find "BuildNumber"') do (
|
rem SystemType
|
||||||
|
rem windows 11 24h2 没有 wmic
|
||||||
|
rem 有的系统精简了 powershell
|
||||||
|
where wmic >nul 2>&1
|
||||||
|
if not errorlevel 1 (
|
||||||
|
for /f "tokens=*" %%a in ('wmic ComputerSystem get SystemType ^| find /i "based"') do (
|
||||||
|
set "SystemType=%%a"
|
||||||
|
)
|
||||||
|
) else (
|
||||||
|
for /f "delims=" %%a in ('powershell -NoLogo -NoProfile -NonInteractive -Command "(Get-WmiObject win32_computersystem).SystemType"') do (
|
||||||
|
set "SystemType=%%a"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
rem BuildNumber
|
||||||
|
for /f "tokens=3" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentBuildNumber') do (
|
||||||
set /a BuildNumber=%%a
|
set /a BuildNumber=%%a
|
||||||
)
|
)
|
||||||
|
|
||||||
set CygwinEOL=1
|
set CygwinEOL=1
|
||||||
|
|
||||||
wmic ComputerSystem get SystemType | find "ARM" > nul
|
echo !SystemType! | find "ARM" > nul
|
||||||
if not errorlevel 1 (
|
if not errorlevel 1 (
|
||||||
if !BuildNumber! GEQ 22000 (
|
if !BuildNumber! GEQ 22000 (
|
||||||
set CygwinEOL=0
|
set CygwinEOL=0
|
||||||
)
|
)
|
||||||
) else (
|
) else (
|
||||||
wmic ComputerSystem get SystemType | find "x64" > nul
|
echo !SystemType! | find "x64" > nul
|
||||||
if not errorlevel 1 (
|
if not errorlevel 1 (
|
||||||
if !BuildNumber! GEQ 9600 (
|
if !BuildNumber! GEQ 9600 (
|
||||||
set CygwinEOL=0
|
set CygwinEOL=0
|
||||||
|
89
reinstall.sh
89
reinstall.sh
@ -443,6 +443,80 @@ run_with_del_cr_template() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_wmic() {
|
||||||
|
if is_have_cmd wmic; then
|
||||||
|
# 如果参数没有 GET,添加 GET,防止以下报错
|
||||||
|
# wmic memorychip /format:list
|
||||||
|
# 此级别的开关异常。
|
||||||
|
has_get=false
|
||||||
|
for i in "$@"; do
|
||||||
|
# 如果参数有 GET
|
||||||
|
if [ "$(to_upper <<<"$i")" = GET ]; then
|
||||||
|
has_get=true
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 输出为 /format:list 格式
|
||||||
|
if $has_get; then
|
||||||
|
command wmic "$@" /format:list
|
||||||
|
else
|
||||||
|
command wmic "$@" get /format:list
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# powershell wmi 默认参数
|
||||||
|
local namespace='root\cimv2'
|
||||||
|
local class=
|
||||||
|
local filter=
|
||||||
|
local props=
|
||||||
|
|
||||||
|
# namespace
|
||||||
|
if [[ "$(to_upper <<<"$1")" = /NAMESPACE* ]]; then
|
||||||
|
# 删除引号,删除 \\
|
||||||
|
namespace=$(cut -d: -f2 <<<"$1" | sed -e "s/[\"']//g" -e 's/\\\\//g')
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# class
|
||||||
|
if [[ "$(to_upper <<<"$1")" = PATH ]]; then
|
||||||
|
class=$2
|
||||||
|
shift 2
|
||||||
|
else
|
||||||
|
case "$(to_lower <<<"$1")" in
|
||||||
|
nicconfig) class=Win32_NetworkAdapterConfiguration ;;
|
||||||
|
memorychip) class=Win32_PhysicalMemory ;;
|
||||||
|
*) class=Win32_$1 ;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# filter
|
||||||
|
if [[ "$(to_upper <<<"$1")" = WHERE ]]; then
|
||||||
|
filter=$2
|
||||||
|
shift 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# props
|
||||||
|
if [[ "$(to_upper <<<"$1")" = GET ]]; then
|
||||||
|
props=$2
|
||||||
|
shift 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ -f "$tmp/wmic.ps1" ]; then
|
||||||
|
curl -Lo "$tmp/wmic.ps1" "$confhome/wmic.ps1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# shellcheck disable=SC2046
|
||||||
|
powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass \
|
||||||
|
-File "$(cygpath -w "$tmp/wmic.ps1")" \
|
||||||
|
-Namespace $namespace \
|
||||||
|
-Class $class \
|
||||||
|
$([ -n "$filter" ] && echo "-Filter $filter") \
|
||||||
|
$([ -n "$props" ] && echo "-Properties $props")
|
||||||
|
}
|
||||||
|
|
||||||
is_virt() {
|
is_virt() {
|
||||||
if [ -z "$_is_virt" ]; then
|
if [ -z "$_is_virt" ]; then
|
||||||
if is_in_windows; then
|
if is_in_windows; then
|
||||||
@ -450,7 +524,7 @@ is_virt() {
|
|||||||
# https://sources.debian.org/src/hw-detect/1.159/hw-detect.finish-install.d/08hw-detect/
|
# https://sources.debian.org/src/hw-detect/1.159/hw-detect.finish-install.d/08hw-detect/
|
||||||
vmstr='VMware|Virtual|Virtualization|VirtualBox|VMW|Hyper-V|Bochs|QEMU|KVM|OpenStack|KubeVirt|innotek|Xen|Parallels|BHYVE'
|
vmstr='VMware|Virtual|Virtualization|VirtualBox|VMW|Hyper-V|Bochs|QEMU|KVM|OpenStack|KubeVirt|innotek|Xen|Parallels|BHYVE'
|
||||||
for name in ComputerSystem BIOS BaseBoard; do
|
for name in ComputerSystem BIOS BaseBoard; do
|
||||||
if wmic $name get /format:list | grep -Eiw $vmstr; then
|
if wmic $name | grep -Eiw $vmstr; then
|
||||||
_is_virt=true
|
_is_virt=true
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
@ -458,8 +532,8 @@ is_virt() {
|
|||||||
|
|
||||||
# 没有风扇和温度信息,大概是虚拟机
|
# 没有风扇和温度信息,大概是虚拟机
|
||||||
if [ -z "$_is_virt" ] &&
|
if [ -z "$_is_virt" ] &&
|
||||||
! wmic /namespace:'\\root\cimv2' PATH Win32_Fan 2>/dev/null | grep -q Name &&
|
! wmic /namespace:'\\root\cimv2' PATH Win32_Fan 2>/dev/null | grep -q ^Name &&
|
||||||
! wmic /namespace:'\\root\wmi' PATH MSAcpi_ThermalZoneTemperature 2>/dev/null | grep -q Name; then
|
! wmic /namespace:'\\root\wmi' PATH MSAcpi_ThermalZoneTemperature 2>/dev/null | grep -q ^Name; then
|
||||||
_is_virt=true
|
_is_virt=true
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
@ -1702,7 +1776,7 @@ install_pkg() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# busybox grep 无法 grep -oP
|
# busybox grep 不支持 -oP
|
||||||
if [ "$cmd" = grep ] && is_have_cmd apk && $cmd |& grep -wq BusyBox; then
|
if [ "$cmd" = grep ] && is_have_cmd apk && $cmd |& grep -wq BusyBox; then
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
@ -1748,7 +1822,7 @@ check_ram() {
|
|||||||
)
|
)
|
||||||
|
|
||||||
if is_in_windows; then
|
if is_in_windows; then
|
||||||
ram_size=$(wmic memorychip get capacity | tail +2 | awk '{sum+=$1} END {print sum/1024/1024}')
|
ram_size=$(wmic memorychip get capacity | awk -F= '{sum+=$2} END {print sum/1024/1024}')
|
||||||
else
|
else
|
||||||
# lsmem最准确但 centos7 arm 和 alpine 不能用,debian 9 util-linux 没有 lsmem
|
# lsmem最准确但 centos7 arm 和 alpine 不能用,debian 9 util-linux 没有 lsmem
|
||||||
# arm 24g dmidecode 显示少了128m
|
# arm 24g dmidecode 显示少了128m
|
||||||
@ -2094,7 +2168,7 @@ collect_netconf() {
|
|||||||
gateway=$(awk '{print $6}' <<<"$route")
|
gateway=$(awk '{print $6}' <<<"$route")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
config=$(wmic nicconfig where InterfaceIndex=$id get MACAddress,IPAddress,IPSubnet,DefaultIPGateway /format:list)
|
config=$(wmic nicconfig where InterfaceIndex=$id get MACAddress,IPAddress,IPSubnet,DefaultIPGateway)
|
||||||
# 排除 IP/子网/网关/MAC 为空的
|
# 排除 IP/子网/网关/MAC 为空的
|
||||||
if grep -q '=$' <<<"$config"; then
|
if grep -q '=$' <<<"$config"; then
|
||||||
continue
|
continue
|
||||||
@ -3425,8 +3499,7 @@ if is_in_windows; then
|
|||||||
# x64-based PC
|
# x64-based PC
|
||||||
# ARM-based PC
|
# ARM-based PC
|
||||||
# ARM64-based PC
|
# ARM64-based PC
|
||||||
basearch=$(wmic ComputerSystem get SystemType /format:list |
|
basearch=$(wmic ComputerSystem get SystemType | grep '=' | cut -d= -f2 | cut -d- -f1)
|
||||||
grep '=' | cut -d= -f2 | cut -d- -f1)
|
|
||||||
else
|
else
|
||||||
# archlinux 云镜像没有 arch 命令
|
# archlinux 云镜像没有 arch 命令
|
||||||
# https://en.wikipedia.org/wiki/Uname
|
# https://en.wikipedia.org/wiki/Uname
|
||||||
|
36
wmic.ps1
Normal file
36
wmic.ps1
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
param(
|
||||||
|
[string]$Namespace,
|
||||||
|
[string]$Class,
|
||||||
|
[string]$Filter,
|
||||||
|
[string]$Properties
|
||||||
|
)
|
||||||
|
|
||||||
|
$propertiesToDisplay = if ($Properties) { $Properties.Split(",") } else { @("*") }
|
||||||
|
|
||||||
|
$wmiQuery = @{
|
||||||
|
Namespace = $Namespace
|
||||||
|
Class = $Class
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($Filter) {
|
||||||
|
$wmiQuery.Filter = $Filter
|
||||||
|
}
|
||||||
|
|
||||||
|
Get-WmiObject @wmiQuery | ForEach-Object {
|
||||||
|
$_.PSObject.Properties | Where-Object {
|
||||||
|
-not $_.Name.StartsWith("__") -and
|
||||||
|
($propertiesToDisplay -contains $_.Name -or $propertiesToDisplay -contains "*")
|
||||||
|
} | ForEach-Object {
|
||||||
|
$name = $_.Name
|
||||||
|
$value = $_.Value
|
||||||
|
|
||||||
|
# 改成 wmic 的输出格式
|
||||||
|
if ($value -is [Array]) {
|
||||||
|
$formattedValue = ($value | ForEach-Object { "`"$_`"" }) -join ","
|
||||||
|
Write-Output "$name={$formattedValue}"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Output "$name=$value"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user