个人博客 用于记载日常收集的一些技术文章 ...
K3 BOS : SQL 去除尾零 K3 BOS : SQL 去除尾零 -- SQL Server 2012 及以上版本

,isnull(replace(format(ut23.FConvertDenominator,'0.##########'), ',', '.') ,'') FBaseQty -- 当前单位 数量
,isnull(replace(format(ut23.FConvertNumerator ,'0.##########'), ',', '.') ,'') FCurrQty -- 基本单位 数量

-- 更早版本

SELECT CAST(MyColumn AS DECIMAL(10, 4)) AS CleanedValue FROM MyTable;



select convert(float ,2658412.000006000) -- 2658412.000006 去除尾零
,convert(float ,2658412.000000) -- 2658412
,convert(decimal(18,4),0.00900) -- 0.0090
,convert(nvarchar(20),convert(decimal(18,4),0.00900)) -- 0.0090

,convert(nvarchar(90),convert(float ,2658412.000006000)) -- 2658412.000006 去除尾零


SELECT FORMAT(your_column * 100, '0.##') + '%' -- 加百分号
FROM your_table;


select

FAppQty
,FActualQty

,(FActualQty - FAppQty) FScrapQty

,(case when FActualQty = FAppQty then '' else format((FActualQty - FAppQty) / FAppQty ,'0.0%') end) FScrapRate2

from TMPB91E1607106311F0ACBF0050563
郭少锋 编辑 2025-05-22 16:05:30 创建 2023-04-11 14:35:07 K3 BOS
Access : 定位到子窗体的最后一行 Access : 定位到子窗体的最后一行
With Me.Sub1.Form '定位到子窗体的最后一行

.RecordsetClone.MoveLast
.Bookmark = .RecordsetClone.Bookmark
End With
郭少锋 创建 2025-05-08 21:41:54 Access
windows : CMD 查看端口使用情况 windows : CMD 查看端口使用情况 --------------------------------------------------------------------------------------------------------------
查看端口 使用情况

netstat -ano | findstr 1688

TCP 0.0.0.0:1688 0.0.0.0:0 LISTENING 3700
TCP [::]:1688 [::]:0 LISTENING 3700

--------------------------------------------------------------------------------------------------------------
查看进程 软件名称

tasklist | findstr 3700

kms-server.exe 3700 Services 0 4,264 K


--------------------------------------------------------------------------------------------------------------
郭少锋 创建 2025-05-08 11:28:37 windows
SQL : 开通端口 防火墙设置 SQL : 开通端口 防火墙设置 要让其他电脑访问 SQL Server,需要在 **SQL Server 配置** 和 **网络/防火墙设置** 上进行配置。以下是详细步骤:

---

## **1. 确保 SQL Server 已启用 TCP/IP 协议**
### **步骤 1:打开 SQL Server 配置管理器**
1. 按 `Win + R`,输入 `SQLServerManager<版本号>.msc`(如 `SQLServerManager15.msc` 适用于 SQL Server 2019)。
- 或通过 **控制面板 → 管理工具 → SQL Server 配置管理器** 打开。

2. 展开 **SQL Server 网络配置** → **协议**(对应实例,如 `MSSQLSERVER` 或命名实例)。
- 如果是默认实例(`MSSQLSERVER`),直接选择 `MSSQLSERVER` 下的 **协议**。
- 如果是命名实例(如 `SQLEXPRESS`),选择对应实例名的 **协议**。

3. 确保 **TCP/IP** 协议已启用(右键 → **启用**)。
- 如果未启用,右键 **TCP/IP** → **启用**,然后重启 SQL Server 服务。

---

### **步骤 2:配置 TCP/IP 端口**
1. 右键 **TCP/IP** → **属性** → **IP 地址** 选项卡。
2. 找到 `IPAll` 部分:
- **TCP 端口**:确保已设置端口(默认 `1433`,可修改为其他端口如 `1688`)。
- **TCP 动态端口**:如果不需要动态端口,留空或删除数值。
3. 如果是命名实例,默认可能使用动态端口(如 `1688`),建议固定端口(如 `1433`)。

---

### **步骤 3:重启 SQL Server 服务**
1. 在 **SQL Server 服务** 中(SQL Server 配置管理器 → 服务):
- 右键 **SQL Server (实例名)** → **重新启动**。
2. 确保服务状态变为 **“正在运行”**。

---

## **2. 检查 Windows 防火墙设置**
SQL Server 默认端口(如 `1433`)需要放行,否则外部无法访问。

### **方法 1:允许 SQL Server 端口通过防火墙**
1. 打开 **Windows Defender 防火墙**(或第三方防火墙如火绒)。
2. 进入 **高级设置** → **入站规则** → **新建规则**。
3. 选择 **端口** → 点击 **下一步**。
4. 选择 **TCP**,并输入端口号(如 `1433` 或自定义端口)→ 点击 **下一步**。
5. 选择 **允许连接** → 点击 **下一步**。
6. 根据需要勾选适用的网络类型(域、专用、公用)→ 点击 **下一步**。
7. 输入规则名称(如 `SQL Server Port 1433`)→ 完成。

### **方法 2:直接放行 `sqlservr.exe`**
1. 在 **入站规则** 中新建规则 → 选择 **程序** → 点击 **下一步**。
2. 浏览到 SQL Server 主程序路径(默认):
```
C:\Program Files\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQL\Binn\sqlservr.exe
```
- `XX` 是 SQL Server 版本号(如 `MSSQL15` 对应 SQL Server 2019)。
3. 允许连接 → 完成规则。

---

## **3. 检查 SQL Server 身份验证模式**
默认情况下,SQL Server 可能仅允许 **Windows 身份验证**,需启用 **SQL Server 和 Windows 身份验证模式**。

### **步骤 1:修改身份验证模式**
1. 打开 **SQL Server Management Studio (SSMS)**,连接 SQL Server。
2. 右键服务器实例 → **属性** → **安全性** 选项卡。
3. 选择 **SQL Server 和 Windows 身份验证模式** → 点击 **确定**。
4. 重启 SQL Server 服务(必须重启才能生效)。

---

### **步骤 2:创建 SQL Server 登录账户**
1. 在 SSMS 中,展开 **安全性 → 登录名**。
2. 右键 → **新建登录名**。
3. 输入用户名(如 `sa` 或自定义账户)。
4. 在 **服务器角色** 中勾选 `sysadmin`(谨慎操作,仅限管理员)。
5. 在 **用户映射** 中勾选目标数据库,并分配权限。
6. 点击 **确定** 保存。

---

## **4. 测试外部连接**
### **方法 1:使用 SQL Server Management Studio (SSMS)**
1. 在另一台电脑上打开 SSMS。
2. 输入服务器名称:
- **本地网络**:`服务器IP,端口`(如 `192.168.1.100,1433`)。
- **主机名**:如果 DNS 可解析,可直接用主机名(如 `SQLServer01`)。
- 如果是命名实例,格式为 `服务器IP\实例名,端口`(如 `192.168.1.100\SQLEXPRESS,1433`)。
3. 选择身份验证方式:
- **SQL Server 身份验证**:输入用户名和密码。
- **Windows 身份验证**:需确保网络信任关系。

---

### **方法 2:使用命令行测试**
在另一台电脑上运行:
```cmd
sqlcmd -S 服务器IP,端口 -U 用户名 -P 密码
```
示例:
```cmd
sqlcmd -S 192.168.1.100,1433 -U sa -P 123456
```
如果成功,会显示 `1>` 提示符。

---

## **5. 其他注意事项**
### **5.1 检查 SQL Server 是否监听正确 IP**
1. 在 SSMS 中运行以下查询:
```sql
EXEC xp_readerrorlog 0, 1, 'Server is listening on';
```
- 确认输出中包含目标 IP 和端口(如 `0.0.0.0:1433` 或 `[::]:1433` 表示监听所有 IPv4/IPv6 地址)。

2. 如果仅监听 `127.0.0.1`(本地回环),需修改 SQL Server 配置:
- 在 **SQL Server 配置管理器** → **TCP/IP 属性** → **IP 地址** 选项卡:
- 确保 `IPAll` 的 `TCP 动态端口` 为空,`TCP 端口` 设置为固定值(如 `1433`)。
- 确保所有 `IPx`(如 `IP1`、`IP2`)的 **已启用** 设为 **是**。

---

### **5.2 检查网络连通性**
1. 在客户端电脑上测试是否能 ping 通 SQL Server:
```cmd
ping 服务器IP
```
2. 测试端口是否开放:
```cmd
telnet 服务器IP 1433
```
- 如果未安装 `telnet`,可通过 **控制面板 → 程序 → 启用或关闭 Windows 功能** 安装。

---

### **5.3 命名实例的特殊配置**
如果使用命名实例(如 `SQLEXPRESS`):
1. 确保 **SQL Server Browser 服务** 已启动:
- 在 **服务管理器** 中找到 `SQL Server Browser`,设置为 **自动启动** 并启动服务。
2. 客户端连接时需指定实例名:
- 格式:`服务器IP\实例名,端口`(如 `192.168.1.100\SQLEXPRESS,1433`)。

---

## **6. 常见问题解决**
| 问题 | 解决方案 |
|------|----------|
| **无法连接,提示“拒绝连接”** | 检查防火墙、SQL Server 是否运行、身份验证模式。 |
| **连接超时** | 检查网络连通性(ping/端口测试),确保 SQL Server 监听正确 IP。 |
| **仅限本地访问** | 检查 SQL Server 是否绑定到 `127.0.0.1`,修改为 `0.0.0.0`。 |
| **命名实例无法连接** | 确保 SQL Server Browser 服务运行,并正确指定实例名。 |

---

## **总结步骤**
1. **启用 TCP/IP 协议** 并固定端口(如 `1433`)。
2. **放行防火墙端口** 或 `sqlservr.exe`。
3. **启用 SQL Server 身份验证模式** 并创建登录账户。
4. **测试网络连通性**(ping/端口测试)。
5. **客户端使用 `IP,端口` 或 `IP\实例名,端口` 连接**。

如果仍有问题,请提供具体的错误信息以便进一步排查!
郭少锋 创建 2025-05-08 11:21:19 SQL
Access : 子窗体 调用 主窗体的事件 Access : 子窗体 调用 主窗体的事件 在 Microsoft Access 中,子窗体可以通过 VBA 代码调用主窗体的事件或方法。以下是几种常见的方法来实现这一功能:

---

### **方法 1:通过 `Parent` 属性引用主窗体**
子窗体可以通过 `Me.Parent` 引用其父窗体(主窗体),然后调用主窗体的公共方法或直接操作其控件。

#### **步骤:**
1. **在主窗体中创建公共方法**
在主窗体的 VBA 模块中定义一个公共方法(例如 `CallMainFormEvent`),用于触发事件逻辑:
```vba
' 主窗体的 VBA 模块
Public Sub CallMainFormEvent()
MsgBox "主窗体的事件被调用了!"
' 或在这里执行其他操作(如刷新数据、更新控件等)
End Sub
```

2. **在子窗体中调用主窗体的方法**
在子窗体的代码中通过 `Me.Parent` 调用主窗体的方法:
```vba
' 子窗体的 VBA 代码(例如按钮点击事件)
Private Sub CommandButton_Click()
If Not Me.Parent Is Nothing Then
Me.Parent.CallMainFormEvent ' 调用主窗体的方法
Else
MsgBox "未找到父窗体!"
End If
End Sub
```

---

### **方法 2:直接操作主窗体的控件**
如果主窗体上的某个控件(如文本框)需要更新,可以直接通过 `Me.Parent` 访问:
```vba
' 子窗体中修改主窗体的文本框
Me.Parent.TextboxName.Value = "新值"
```

---

### **方法 3:触发主窗体的事件(需间接实现)**
Access 的窗体事件(如 `OnClick`、`OnLoad`)不能直接通过代码触发,但可以通过以下方式间接实现:
1. 在主窗体中创建一个公共方法(如 `SimulateEvent`),将事件逻辑封装在方法中。
2. 在子窗体中调用该方法。

---

### **注意事项**
1. **确保主窗体已加载**
如果子窗体独立打开(非嵌入主窗体),`Me.Parent` 可能为 `Nothing`。此时需确保主窗体已加载或通过其他方式引用。

2. **命名一致性**
如果主窗体是子窗体的容器(如 `Form_SubformContainer`),可能需要通过 `Me.Parent.Parent` 访问(例如子窗体嵌套在导航窗体中)。

3. **错误处理**
始终检查 `Me.Parent` 是否存在,避免运行时错误。

---

### **完整示例**
假设主窗体名为 `frmMain`,子窗体名为 `frmSubform`,按钮点击时触发主窗体的事件:

#### 主窗体代码:
```vba
' frmMain 的 VBA 模块
Public Sub HandleChildEvent()
MsgBox "主窗体收到子窗体的调用!"
' 其他逻辑...
End Sub
```

#### 子窗体代码:
```vba
' frmSubform 的 VBA 代码
Private Sub btnCallParent_Click()
If Not Me.Parent Is Nothing Then
Me.Parent.HandleChildEvent ' 调用主窗体的方法
Else
MsgBox "错误:未找到父窗体!"
End If
End Sub
```

---

通过以上方法,子窗体可以灵活地与主窗体交互。如果需要更复杂的通信(如跨多个嵌套窗体),建议使用全局变量或模块级变量传递数据。
郭少锋 创建 2025-05-08 09:46:42 Access
windows : win11 刚装完,会自动加密 C盘 windows : win11 刚装完,会自动加密 C盘 要打开【控制面板】【所有控制面板项】【BitLocker 驱动器加密】启用【BitLocker 加密】,再关闭【BitLocker 加密】

【解密】需要时间,请耐心等待。
郭少锋 创建 2025-05-05 17:56:57 windows
windows : 固态硬盘 VMware 建议使用 单个文件磁盘 windows : 固态硬盘 VMware 建议使用 单个文件磁盘 在固态硬盘(SSD)上安装VMware虚拟磁盘时,选择**单个文件**还是**分割成多个文件**取决于具体需求和使用场景。以下是两者的对比和建议:

---

### **1. 单个文件(推荐默认选项)**
- **优点**:
- **性能更优**:SSD的随机读写性能强,单个大文件能充分利用其连续写入的优势,减少寻址开销。
- **管理简单**:备份、迁移或复制虚拟机时只需处理一个文件,操作更方便。
- **兼容性更好**:某些工具(如快照、克隆)对单个文件的支持更完善。
- **减少碎片**:SSD本身无机械结构,单个大文件不易产生碎片(即使有,SSD的TRIM机制也能高效处理)。
- **缺点**:
- 如果虚拟磁盘非常大(如数TB),单个文件可能受限于文件系统(如FAT32仅支持4GB单文件),但现代系统(NTFS/exFAT)通常无此问题。

---

### **2. 分割成多个文件**
- **优点**:
- **兼容性旧系统**:某些老旧操作系统或文件系统可能对单个大文件支持不佳(但现代SSD+VMware场景极少遇到)。
- **部分备份灵活性**:可单独备份/恢复某个分片(但实际使用中,快照和差异磁盘已提供类似功能)。
- **缺点**:
- **性能略低**:多文件可能导致更多的随机写入(尤其是频繁的小文件操作),SSD虽能缓解,但仍不如单文件高效。
- **管理复杂**:迁移或备份时需处理多个文件,易遗漏或出错。

---

### **建议选择**
- **优先选单个文件**:
对绝大多数用户(尤其是SSD用户),单个文件是更优选择,性能更好且易于管理。VMware的默认设置通常也是单文件。
- **考虑分割的情况**:
仅在你需要将虚拟磁盘分散到不同物理磁盘(如RAID阵列的不同分区),或因特殊限制(如旧系统兼容性)时才选择分割。

---

### **其他注意事项**
- **文件系统选择**:确保主机磁盘使用高性能文件系统(如NTFS/exFAT),避免FAT32的限制。
- **快照与差异磁盘**:若需频繁快照,VMware的快照机制会自动生成差异文件,此时主磁盘仍建议用单文件。
- **虚拟磁盘类型**:
- **厚置备延迟置零**/厚置备立即置零:适合单文件。
- **精简置备**:单文件或分割均可,但单文件仍更高效。

---

### **总结**
在SSD环境下,**单个大文件是主流推荐方案**,除非有明确需求(如跨磁盘分布),否则无需分割。VMware的默认设置已针对性能优化,遵循默认选项即可。
郭少锋 创建 2025-05-05 17:38:19 windows
SQL : 以多个字段分组 将某个字段的不同值 合并成一串字符(逗号分隔) SQL : 以多个字段分组 将某个字段的不同值 合并成一串字符(逗号分隔) # MSSQL 以多个字段分组并将某个字段的不同值合并成一串字符(逗号分隔)

select *

,isnull( stuff((

select ',' + FCreator

from ( select distinct FBillNo_Rpt,FSeq_Rpt,FBillNo_PpBom,FMtrlNo2,FUnitName2,FScrapRate,FDenominator ,FCreator from TMP69E1ED8B1F7811F0ACC00050563_1 where FCreator != '' ) t2

where t1.FBillNo_Rpt = t2.FBillNo_Rpt and t1.FSeq_Rpt = t2.FSeq_Rpt
and t1.FBillNo_PpBom = t2.FBillNo_PpBom
and t1.FMtrlNo2 = t2.FMtrlNo2 and t1.FUnitName2 = t2.FUnitName2
and t1.FScrapRate = t2.FScrapRate
and t1.FDenominator = t2.FDenominator

for xml path('')

), 1, 1, '') ,'') as FCreatorTxt

from TMP69E1ED8B1F7811F0ACC00050563 t1





在MSSQL中,你可以使用STRING_AGG函数(SQL Server 2017及更高版本)或FOR XML PATH方法(旧版本)来实现按多个字段分组并将某个字段的不同值合并成逗号分隔的字符串。

## 方法1:使用STRING_AGG函数(SQL Server 2017+)

```sql
SELECT
field1,
field2,
field3,
STRING_AGG(DISTINCT value_field, ',') AS concatenated_values
FROM
your_table
GROUP BY
field1, field2, field3;
```

## 方法2:使用FOR XML PATH方法(SQL Server 2005+)

```sql
SELECT
field1,
field2,
field3,
STUFF((
SELECT ',' + value_field
FROM your_table t2
WHERE t1.field1 = t2.field1
AND t1.field2 = t2.field2
AND t1.field3 = t2.field3
FOR XML PATH('')
), 1, 1, '') AS concatenated_values
FROM
your_table t1
GROUP BY
field1, field2, field3;
```

## 示例

假设有一个订单明细表,你想按客户ID和订单日期分组,合并所有产品名称:

```sql
-- 使用STRING_AGG
SELECT
CustomerID,
CONVERT(date, OrderDate) AS OrderDate,
STRING_AGG(DISTINCT ProductName, ', ') AS Products
FROM
OrderDetails
GROUP BY
CustomerID, CONVERT(date, OrderDate);

-- 使用FOR XML PATH
SELECT
CustomerID,
CONVERT(date, OrderDate) AS OrderDate,
STUFF((
SELECT ', ' + ProductName
FROM OrderDetails t2
WHERE t1.CustomerID = t2.CustomerID
AND CONVERT(date, t1.OrderDate) = CONVERT(date, t2.OrderDate)
FOR XML PATH('')
), 1, 2, '') AS Products
FROM
OrderDetails t1
GROUP BY
CustomerID, CONVERT(date, OrderDate);
```

注意:
1. STRING_AGG是更现代、更简洁的方法
2. 如果需要去除重复值,STRING_AGG可以直接使用DISTINCT关键字
3. FOR XML PATH方法需要手动处理第一个逗号(使用STUFF函数)
4. 两种方法都可以添加排序:STRING_AGG使用WITHIN GROUP,FOR XML PATH在子查询中添加ORDER BY
郭少锋 编辑 2025-04-22 21:17:17 创建 2025-04-22 20:44:52 SQL
SQL : 查看数据库 版本号 SQL : 查看数据库 版本号 SELECT @@VERSION AS 'SQL Server Version';

结果
Microsoft SQL Server 2014 (SP2-GDR) (KB4505217) - 12.0.5223.6 (X64) May 26 2019 20:36:50 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 22631: )
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Developer Edition (64-bit) on Windows Server 2019 Datacenter 10.0 <X64> (Build 17763: ) (Hypervisor)
郭少锋 编辑 2025-04-22 20:48:41 创建 2025-04-22 20:47:26 SQL
windows : VMware 两台虚拟机 双网卡连接 windows : VMware 两台虚拟机 双网卡连接 在 VMware 中配置两台虚拟机(VM)通过双网卡连接双网段,可以实现跨网段通信或隔离测试。以下是详细步骤:

---

## **1. 网络拓扑规划**
假设:
- **VM1** 和 **VM2** 各有两个网卡(NIC1、NIC2)。
- **网段1**:`192.168.1.0/24`(VM1-NIC1 ↔ VM2-NIC1)
- **网段2**:`10.0.0.0/24`(VM1-NIC2 ↔ VM2-NIC2)

```
VM1:
- NIC1: 192.168.1.1/24
- NIC2: 10.0.0.1/24

VM2:
- NIC1: 192.168.1.2/24
- NIC2: 10.0.0.2/24
```

---

## **2. VMware 虚拟网络配置**
### **方法1:使用 VMware NAT / Host-Only 网络**
1. **创建两个自定义虚拟网络**(适用于不同网段):
- 打开 **VMware Workstation > 编辑 > 虚拟网络编辑器**。
- 添加两个网络(如 `VMnet2` 和 `VMnet3`),分别配置:
- **VMnet2**(网段1):`192.168.1.0/24`(取消 DHCP)
- **VMnet3**(网段2):`10.0.0.0/24`(取消 DHCP)

2. **为虚拟机分配网卡**:
- 右键 VM > **设置 > 添加网络适配器**(确保每个 VM 有两个网卡)。
- 分别将:
- **VM1-NIC1** 和 **VM2-NIC1** 连接到 `VMnet2`(192.168.1.0/24)。
- **VM1-NIC2** 和 **VM2-NIC2** 连接到 `VMnet3`(10.0.0.0/24)。

### **方法2:使用桥接模式(Bridged)**
- 如果希望虚拟机直接接入物理网络(如实验室环境),可将两个网卡分别桥接到不同的物理网卡或 VLAN。

---

## **3. 虚拟机内部网络配置**
### **Windows 虚拟机**
1. **配置静态 IP**:
- 打开 **控制面板 > 网络和共享中心 > 更改适配器设置**。
- 分别设置两个网卡的 IPv4 地址:
- **VM1**:
- NIC1: `192.168.1.1/24`(网关留空)
- NIC2: `10.0.0.1/24`(网关留空)
- **VM2**:
- NIC1: `192.168.1.2/24`
- NIC2: `10.0.0.2/24`

2. **关闭防火墙(临时测试)**:
```powershell
netsh advfirewall set allprofiles state off
```

### **Linux 虚拟机(Ubuntu/CentOS)**
1. **配置静态 IP**:
```bash
# VM1
sudo ip addr add 192.168.1.1/24 dev ens33 # NIC1
sudo ip addr add 10.0.0.1/24 dev ens34 # NIC2

# VM2
sudo ip addr add 192.168.1.2/24 dev ens33 # NIC1
sudo ip addr add 10.0.0.2/24 dev ens34 # NIC2
```
(`ens33`、`ens34` 是网卡名,可用 `ip a` 查看)

2. **关闭防火墙(临时)**:
```bash
sudo systemctl stop firewalld # CentOS
sudo ufw disable # Ubuntu
```

---

## **4. 测试连通性**
- **在 VM1 上 Ping VM2**:
```bash
ping 192.168.1.2 # 测试网段1
ping 10.0.0.2 # 测试网段2
```
- **在 VM2 上 Ping VM1**:
```bash
ping 192.168.1.1
ping 10.0.0.1
```

如果都能 Ping 通,说明双网卡双网段连接成功!

---

## **5. 高级配置(可选)**
### **路由配置(如需跨网段访问)**
- 如果 VM 需要访问外部网络(如互联网),需在 VMware 虚拟网络设置中启用 **NAT** 或手动添加路由:
```bash
# 在 VM1 上添加默认路由(假设 192.168.1.254 是网关)
sudo ip route add default via 192.168.1.254
```

### **端口转发(NAT 模式)**
- 如果使用 NAT 模式,可在 **虚拟网络编辑器** 中设置端口转发,使外部能访问 VM。

---

## **6. 常见问题**
### **Q1: Ping 不通**
- 检查 VMware 虚拟网络是否绑定正确。
- 确保两台 VM 的 IP 在同一子网。
- 关闭防火墙临时测试。

### **Q2: 虚拟机无法获取 IP**
- 确保虚拟网络未启用 DHCP,或手动设置了静态 IP。

### **Q3: 网卡未识别**
- 在虚拟机设置中检查网卡是否已连接。
- 在 Linux 中使用 `ifconfig -a` 或 `ip a` 查看网卡状态。

---

## **总结**
| 步骤 | 操作 |
|------|------|
| 1. 规划网段 | `192.168.1.0/24` 和 `10.0.0.0/24` |
| 2. VMware 网络配置 | 创建 `VMnet2` 和 `VMnet3` |
| 3. 虚拟机网卡分配 | VM1-NIC1 ↔ VM2-NIC1(网段1),VM1-NIC2 ↔ VM2-NIC2(网段2) |
| 4. 虚拟机 IP 配置 | 手动设置静态 IP |
| 5. 测试 | `ping` 对方 IP |

按照以上步骤,即可实现 VMware 双虚拟机双网卡跨网段通信!
郭少锋 创建 2025-04-22 15:27:12 windows