hoochanlon 发表于 2023-2-14 16:26

powershell面向装机编程——快捷修改IP与软件安装自动化

## 缘起

主要原因:

1. 系统封装挺繁琐的,有广告,锁主页。
2. 很多软件都要点下一步,很机械,过重复。
3. 手动改IP多次,不断找图形界面,操作很繁琐。
4. 网上的网络配置方面的相关编程,易用性不理想:
        5.所用编程语言不同,个人环境相差较大,调试容错率低,学习成本高
        6.IP、DNS,各项配置相对分散,不集中,整合起来相对困难。
       
5. 自己三年前写的批处理,能看懂但太费劲吃力了,不好调...还不如重新写。

这算的上是一次旧活新整吧。索性一次软件、配IP全搞定。也方便到时候再拿来用。(注:win7是叫“本地连接”,所有代码测试均在win10、win11主机)

## 自动静默所有软件

### 实现与解读

(https://github.com/hoochanlon/ihs-simple/blob/main/ez_auto_install.ps1)源码附上及加注释说明。

```
echo "提示:把需要自动安装的软件,拷贝到下载目录文件夹即可。"


# 定义静默安装目录路径
$rawPath = "C:${Env:\HOMEPATH}\Downloads\";
# Get-ChildItem是获取子项目的意思,可以获取一个目录下的文件和子目录。
$allFile = Get-ChildItem -Path $rawPath;
# foreach遍历目录
foreach ($file in $allFile)
{
# 转成文件路径字符串。
$softname="C:${Env:\HOMEPATH}\Downloads\"+$file.name
# Write-Host $softname
Start-Process -Wait -FilePath $softname -ArgumentList '/S /SP- /VERYSILENT /NORESTART /SUPPRESSMSGBOXES /FORCE' -PassThru
}
echo "ok"
```

核心就两逻辑:一、在已有静默安装的前提选项上,我需要知道文件夹下面的所有软件名;二、每遍历一次目录、文件什么的,网上这样样例玩具代码,一抓一大把;配合上自己的逻辑思想,得发挥作用才行;每执行一遍静默安装就好了,把遍历过的自变量投射到静默安装指令上就行了。

单提下静默安装,我查了下资料,这些参数和软件打包方式有关,索性都加上吧。还有个`/FORCE` ,虽然文章没提,但我加上后测试也没报错。

资料:(https://www.cnblogs.com/toor/p/4198061.html)

```
Start-Process -Wait -FilePath $softname -ArgumentList '/S /SP- /VERYSILENT /NORESTART /SUPPRESSMSGBOXES /FORCE' -PassThru
```

### 测试效果

基本上不少软件都支持静默安装,除了对福昕PDF阅读器同类别的打包方式程序,静默安装不起作用。

钉钉原则上是不支持静默安装的,参考[钉钉帮助中心](https://www.dingtalk.com/qidian/help-detail-1061108002.html),但目前代码测试正常,也可能是我用离线版安装包的缘故包吧。

##简化批量装机配置IP步骤

(https://github.com/hoochanlon/ihs-simple/blob/main/ez_edit_net.ps1),源码修改网络的每项配置都整合在一起,并不方便拿来用。并且我考虑到文件要正常执行,到最后也是还原为动态获取,变更了下dns罢了。

所以这里做下分块处理,方便CV直接使用。

### 常用三项

写死型IP配置,三项为:IP、掩码、网关

```
netsh interface ip set address "以太网" static 192.168.1.123 255.255.255.0192.168.1.1
```

写死型DNS配置

```
Set-DnsClientServerAddress -InterfaceAlias "以太网" -ServerAddresses ("114.114.114.114","8.8.8.8")
```

动态IP与DNS

```
netsh interface ip set address "以太网" dhcp
netsh interface ip set dnsservers "以太网" source=dhcp
```

### IP调试与测试用(装机也是常用项)

手动输入IP,保存就好。子网掩码、网关、DNS根据自己所在公司内部局域网环境改动就好。

```
# 1. 保存改写IP、DNS之前历史信息
netsh interface ip show config > ipbak.txt
## 1.2 打印必要提示
echo "cmd运行 ipbak.txt 查看备份信息;扔入垃圾桶:del ipbak.txt"
# 2. 修改IP、子网掩码、网关
$input_ip = Read-Host "输入IP地址";netsh interface ip set address "以太网" static $input_ip 255.255.255.0192.168.1.1
# 3. 设置DNS,并打印OK
Set-DnsClientServerAddress -InterfaceAlias "以太网" -ServerAddresses ("114.114.114.114","8.8.8.8");echo "OK"

```

逻辑基本也在注释里了,基本上每条指令都能单独拿出来用,挺方便。

###从网站获取dns(较少使用,可实现罢了)

个人整活,普及性来说意义不太大。

```
# 扩展:反向解析 nslookup -ty=ptr 1.1.1.1

# 1. 从nslookup解析网址中,获取到索引行dns记录,注入文本;dns.sb是一个dns域名。
nslookup dns.sb|Select-Object -Index 4 >dns-w.txt
# 2. 获取dns-w.txt文本内容,利用正则筛选出IP地址,$matches取值
(Get-Content dns-w.txt) -match '\d+\.\d+\.\d+\.\d+'; $get_dns_num = $matches
# 设置dns,将变量参数填入进去
Set-DnsClientServerAddress -InterfaceAlias "以太网" -ServerAddresses ($get_dns_num)
# 顺便把解析记录文本删掉,打印ok
del dns-w.txt;echo "ok"

```

## 测试效果图

昨天测试,2.13,自动安装

![](https://fastly.jsdelivr.net/gh/hoochanlon/ihs-simple/AQUICK/1278564751CE.png)

2.14 IP配置powershell脚本运行正常

![](https://fastly.jsdelivr.net/gh/hoochanlon/ihs-simple/AQUICK/catch2023-02-14%2016.12.19.png)

## 参考资料

自动安装参考:

* (https://www.cnblogs.com/toor/p/4198061.html)
* (https://www.cnblogs.com/068XS228/p/15466163.html)
* (https://blog.csdn.net/CHCH998/article/details/107726143)

修改IP、DNS配置参考:

* [用netsh查看和设置IP地址、DNS地址、防火墙](https://blog.51cto.com/guochunyang/5851385)
* [如何在Windows中使用Powershell Grep或Select-String Cmdlet Grep文本文件?](https://blog.csdn.net/cunjiu9486/article/details/109074646)
* (https://blog.csdn.net/qq_41863100/article/details/120360662)
* (https://www.cnblogs.com/awpatp/p/4549119.html)
* [【自分用メモ】PowerShellによるIPアドレスの設定及び変更](https://qiita.com/Kirito1617/items/aed439bcb66c63489337)
* (https://www.coder.work/article/7399792)
* [术之多-Powershell过滤管道结果](https://www.shuzhiduo.com/A/MAzAb2xMJ9/)
* (https://www.nhooo.com/note/qacidn.html)
* (https://blog.csdn.net/zx77588023/article/details/107116196/)
* (https://blog.csdn.net/weixin_42426841/article/details/115364502)
* [国内可用的 IPv6 公共 DNS 和加密 DNS](https://www.cccitu.com/2205359.html)
* (https://blog.csdn.net/sxeric/article/details/122403591)

hoochanlon 发表于 2023-2-19 13:42

补充一下吧,今天在思考ssh连接的时候,忽然想到这个网站解析dns,也有用。

```
# 扩展:反向解析 nslookup -ty=ptr 1.1.1.1

# 1. 从nslookup解析网址中,获取到索引行dns记录,注入文本;dns.sb是一个dns域名。
nslookup dns.sb|Select-Object -Index 4 >dns-w.txt
# 2. 获取dns-w.txt文本内容,利用正则筛选出IP地址,$matches取值
(Get-Content dns-w.txt) -match '\d+\.\d+\.\d+\.\d+'; $get_dns_num = $matches
# 设置dns,将变量参数填入进去
Set-DnsClientServerAddress -InterfaceAlias "以太网" -ServerAddresses ($get_dns_num)
# 顺便把解析记录文本删掉,打印ok
del dns-w.txt;echo "ok"
```

比如SSH的云主机基本在家的网络环境用,不知道公司IP,就可以输入公司的网址,解析成IP,做些加工优化网段加入到ssh登录策略里来。这是种懒人思维。

hoochanlon 发表于 2023-2-17 17:09

朔然ゝDendi 发表于 2023-2-17 16:13
# 定义静默安装目录路径
$rawPath = "D:\install\";



我把$softname写死了,自用,没太注意细节。调整一下$rawPath、$softname变量写法就好了。

```
$softname=$rawPath+$file.name
```

解释:

* $rawPath 实际上是给`Get-ChildItem -Path`获取子项目录用的,通过foreach遍历。

* $softname 从子项目录中获取到文件名。要想获得整个的完整路径,所以就得加上`$rawPath`,

张道陵 发表于 2023-2-14 16:57

谢谢分享

hoochanlon 发表于 2023-2-14 17:04

本帖最后由 hoochanlon 于 2023-2-14 17:06 编辑

张道陵 发表于 2023-2-14 16:57
谢谢分享
不客气。反正大家都用的到的。虽然查看及修改IP、DNS有很多种方式,我现在觉得能简单易读易懂,就尽量怎么来吧。保存到装机PE盘里一把梭。 :Dweeqw

debug_cat 发表于 2023-2-14 17:12

重复的工作让电脑自己做:lol

hoochanlon 发表于 2023-2-14 17:16

莫问刀 发表于 2023-2-14 17:12
重复的工作让电脑自己做

其实也是以前刚出来工作,在一家IT外包,然后批量装机,太痛苦了....{:301_972:}

paperbox 发表于 2023-2-14 17:37


谢谢分享

dujiu3611 发表于 2023-2-14 18:04

感谢分享,先存个源码,在对比着慢慢试 {:1_905:}

hoochanlon 发表于 2023-2-14 18:16

dujiu3611 发表于 2023-2-14 18:04
感谢分享,先存个源码,在对比着慢慢试

都能跑的,只要不切换目录基本没影响,开个新窗口都可以。信息存档的txt默认是在system32文件下面,所以cmd可以直接输入调用。删除的话就`del ipbak.txt`,我个人是习惯everything的方式。

bmwgtr 发表于 2023-2-14 18:53

感谢大佬分享,正好装系统,已投,收了~{:301_993:}

hoochanlon 发表于 2023-2-14 19:08

bmwgtr 发表于 2023-2-14 18:53
感谢大佬分享,正好装系统,已投,收了~

谢谢支持;批量自动安装,用的话,注意一下自己的安装选择目录。默认是在下载文件文件夹。


```
$rawPath = "C:${Env:\HOMEPATH}\Downloads\"
```

大家也可以看自己需求,改成D盘或其他盘的某个文件夹。如下:

```
$rawPath = "D:\install\"
```

文件夹下的软件是一定要有的,不然遍历扫描不到的,自然也就无法安装了。
页: [1] 2
查看完整版本: powershell面向装机编程——快捷修改IP与软件安装自动化