如何将文本文件的OU值传入Invoke-VMScript命令在DC中创建AD组织单元?
问题根因
- 本地读取的OU结构变量直接嵌入待传入虚拟机的脚本字符串时,PowerShell本地解析会自动将数组展开为纯文本,传到虚拟机后无法正常遍历
- 原始脚本中OU路径使用
/分隔,但代码里用Split('\')按反斜杠切割,路径匹配完全错误 - 手动拼接多行脚本需要处理大量转义字符和换行,非常容易出现语法错误
修正后的完整代码
# 本地读取OU结构文件 $OUStructure = Get-Content "C:\Users\admr_mornevr\Documents\PowerShell\OdekSpace\Active Directory\OUs\OdekOUStructure.txt" # 把OU数组序列化为JSON字符串,避免嵌入脚本时解析异常 $OUsJson = $OUStructure | ConvertTo-Json # 用Here-String定义待传入虚拟机的脚本,自动保留换行无需手动处理转义 $CreateOUs = @" `$MyDomain = Get-ADDomain | Select-Object -ExpandProperty DistinguishedName `$OUStructure = $OUsJson | ConvertFrom-Json `$OUStructure | ForEach-Object { # 按正斜杠切割OU路径 `$ouParts = `$_ -split '/' `$currentPath = `$MyDomain # 层级创建OU,自动处理父OU依赖 foreach (`$part in `$ouParts) { # 先判断OU是否存在,避免重复创建报错 if (-not (Get-ADOrganizationalUnit -Filter "Name -eq '$`part'" -SearchBase `$currentPath -SearchScope OneLevel -ErrorAction SilentlyContinue)) { New-ADOrganizationalUnit -Name `$part -Path `$currentPath } `$currentPath = "OU=`$part,`$currentPath" } } "@ # 执行脚本 Invoke-VMScript -ScriptType PowerShell -ScriptText $CreateOUs -VM $DCName -GuestCredentials $DomainCredential
关键修改说明
- 通过JSON序列化/反序列化传递本地OU列表,彻底解决跨环境变量传递问题
- 双引号Here-String自动保留换行格式,不需要手动处理转义字符和换行符
- 层级遍历创建OU,自动解决父OU未提前创建的报错问题
- 增加OU存在性校验,重复执行脚本不会抛出冲突错误
- 直接使用AD模块原生命令,比ADSI写法更简洁、容错性更高
如果你要继续使用CSV方案,只需要把上述代码中读取TXT的逻辑替换为
Import-Csv,再将读取到的CSV对象按同样的JSON序列化方式传入虚拟机即可,不要直接把本地的$OUs变量嵌入脚本字符串。
内容的提问来源于stack exchange,提问作者Morne van Rensburg
相关产品推荐
相关产品推荐

