如何编写通用PowerShell脚本按父文件夹名重命名Windows 10电脑
现有代码的核心问题
- NewName参数写死为固定字符串,完全没有对接脚本父文件夹的动态名称,不管脚本放在哪个文件夹下,最终都会把电脑重命名为预设的固定文本,根本实现不了按文件夹名自动命名的需求。
- DomainCredential参数传值类型完全不匹配:该参数要求传入PSCredential类型的凭据对象,当前代码直接传入
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name,返回值只是格式为“域/用户名”的纯文本字符串,PowerShell解析时会直接触发类型不匹配错误,导致命令执行中断。 - 场景适配缺失:Rename-Computer的DomainCredential参数仅在域环境下需要使用,在工作组环境的个人电脑上硬加这个参数会直接触发参数无效错误,不具备跨机器通用的能力。
- 合规校验缺失:Windows对电脑名称有强制规则(最大15字符、不能包含
< > : " / \ | ? *等特殊符号、不能全为数字),直接拿原始文件夹名称做重命名值,只要文件夹名不符合规则就会直接执行失败;同时没有处理“当前电脑名已经和目标名一致”的场景,重复触发重命名也会抛错。
通用可落地的实现方案
实现逻辑
- 动态定位脚本的存放路径,提取上层父文件夹的名称作为重命名的原始数据源
- 对提取到的原始名称做规则清洗,剔除不符合Windows命名要求的字符,裁剪长度到系统允许的范围
- 自动判断当前设备是域加入还是工作组环境,适配对应的运行参数,无需硬编码场景
- 加入前置校验和错误捕获,避免无意义的执行报错
可直接运行的脚本代码
# 获取当前脚本的父文件夹名称 $scriptFullPath = $MyInvocation.MyCommand.Path $scriptParentPath = Split-Path -Path $scriptFullPath -Parent $parentFolderName = Split-Path -Path $scriptParentPath -Leaf # 清洗名称适配Windows电脑命名规则 $validName = $parentFolderName -replace '[^a-zA-Z0-9-]', '' # 裁剪到系统允许的15字符最大长度 if ($validName.Length -gt 15) { $validName = $validName.Substring(0, 15) } # 校验清洗后的名称有效性 if ([string]::IsNullOrWhiteSpace($validName) -or $validName -match '^\d+$') { Write-Error "父文件夹名称清洗后不符合电脑命名规则,终止重命名流程" exit 1 } # 适配域/工作组场景 $computerSystem = Get-CimInstance -ClassName Win32_ComputerSystem $renameConfig = @{ NewName = $validName Force = $true Restart = $false } # 域环境下按需补充凭据参数 if ($computerSystem.PartOfDomain) { # 若当前运行账号本身具备域设备改名权限,可注释下一行,直接用当前上下文执行 $domainAccount = Get-Credential -Message "请输入具备域设备改名权限的账号凭据" $renameConfig['DomainCredential'] = $domainAccount } # 执行重命名 try { Rename-Computer @renameConfig Write-Host "设备重命名为 $validName 操作执行成功,重启后生效" $confirmRestart = Read-Host "是否立即重启?输入Y确认重启,按其他键取消" if ($confirmRestart -eq 'Y') { Restart-Computer -Force } } catch { Write-Error "重命名执行失败:$_" }
运行注意事项
- 必须用管理员权限启动PowerShell实例运行脚本,普通权限上下文没有修改设备名的系统权限
- 之前执行的
Set-ExecutionPolicy Bypass -Scope Process仅用于放开脚本执行的策略限制,无法解决参数类型错误、权限不足、命名规则不匹配类的执行失败问题 - 如果脚本在域环境内批量部署,可提前移除Get-Credential的交互逻辑,确保运行脚本的账号本身具备对应域设备的重命名权限,就能实现无交互运行
内容的提问来源于stack exchange,提问作者ACE
相关产品推荐
相关产品推荐

