PowerShell脚本检查CSV中计算机名避免重复写入
问题解决脚本及说明
先明确你原脚本里的几个核心问题:
- 原脚本中
Export-Csv -Path $csv是错误用法,$csv是Import-Csv读取的对象集合,不是文件路径,应该直接传入UNC路径 - 无效脚本里
$file变量未定义,且直接用-contains判断对象数组不对,必须先提取CsDNSHostName列的所有值再做判断
修正后的完整脚本:
# 定义参数 $csvPath = '\\UNC\PATH\file.csv' $currentHostName = $env:COMPUTERNAME $props = 'CsSystemFamily','CsDNSHostName', 'CsManufacturer' # 检查CSV文件是否存在 if (Test-Path -Path $csvPath) { # 读取现有CSV并提取已存在的主机名列表 $existingData = Import-Csv -Path $csvPath -Delimiter ';' $existingHostNames = $existingData.CsDNSHostName } else { # 文件不存在时,初始化空数组 $existingHostNames = @() } # 判断当前主机名是否已存在 if ($existingHostNames -contains $currentHostName) { Write-Host "计算机名 $currentHostName 已存在于CSV中,跳过写入" } else { # 获取当前计算机信息并追加到CSV Get-ComputerInfo | Select-Object -Property $props | Export-Csv -Path $csvPath -NoTypeInformation -Delimiter ';' -Append Write-Host "已成功写入计算机 $currentHostName 的信息" }
关键说明:
Test-Path检查文件存在:避免第一次运行时CSV未创建导致Import-Csv报错- 提取
CsDNSHostName列:把CSV里的所有主机名转换成字符串数组,这样-contains才能正确判断 - 修正
Export-Csv路径参数:直接传入UNC路径,而非Import-Csv返回的对象 -Append模式:确保新数据不会覆盖原有内容
GPO部署额外注意:
- 要保证执行脚本的计算机账户拥有UNC路径的写入权限,否则会执行失败
- 可自行添加
try/catch块捕获权限或其他异常,方便排查问题
内容的提问来源于stack exchange,提问作者Charles94630
相关产品推荐
相关产品推荐

