找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 8030|回复: 15

[文本处理] 【已解决】批处理将主板名称重命名计算机名称

[复制链接]
发表于 2025-7-27 11:55:26 | 显示全部楼层 |阅读模式
本帖最后由 chishingchan 于 2025-7-29 16:30 编辑

鉴于计算机名称规范

不允许包含以下的字符:
反斜杠 (\)
斜杠 (/)
冒号 (
星号 (*)
问号 (?)
引号 (")
小于符号 (<)
大于符号 (>)
竖线 (|)
逗号 (,)

名称长度规则:
最小名称长度:1 个字符
最大名称长度:15 个字符

例如,计算机的名称变量:
z=A B"C,D.E/F:G?H\I^|J^<K^>L*M-N

在规范上再添加 句号 (.)、空格 ( ),全都替换为 下划线 (_),即最终结果为:
z=A_B_C_D_E_F_G_H

求助,批处理该如何编写?谢谢!

谢谢以下各位的解答,总结如下:
  1. @echo off
  2. set z=A B"C,D.E/F:G?H\I^|J^<K^>L*M-N
  3. echo:%z%
  4. set "z=%z: =_%"
  5. set "z=%z:"=_%"
  6. set "z=%z:,=_%"
  7. set "z=%z:.=_%"
  8. set "z=%z:/=_%"
  9. set "z=%z::=_%"
  10. set "z=%z:?=_%"
  11. set "z=%z:\=_%"
  12. set "z=%z:|=_%"
  13. set "z=%z:<=_%"
  14. set "z=%z:>=_%"
  15. echo:%z%
  16. set "z=%z:~0,15%"
  17. echo:%z%&pause&exit/b
复制代码
显示结果:
  1. A B"C,D.E/F:G?H\I^|J^<K^>L*M-N
  2. A_B_C_D_E_F_G_H_I_J_K_L*M-N
  3. A_B_C_D_E_F_G_H
  4. 请按任意键继续. . .
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2025-7-27 20:59:17 | 显示全部楼层
回复 1# chishingchan

是要更名计算机名称还是仅仅要替换字符串中的空格和圆点?
 楼主| 发表于 2025-7-27 21:30:19 | 显示全部楼层
回复 2# aloha20200628


    变量是变量(非固定字符串)。替换字符串相关字符即可。谢谢!
发表于 2025-7-27 21:43:02 | 显示全部楼层
回复 3# chishingchan
是要以下这段代码吗...

  1. @echo off
  2. set "p=C.A68M-P PRO"
  3. set "p=%p:.=_%
  4. set "p=%p: =_%
  5. echo,%p%&pause&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
chishingchan + 1 谢谢解答!

查看全部评分

发表于 2025-7-28 08:22:01 | 显示全部楼层
回复 1# chishingchan
  1. @echo off
  2. set "Product=C.A68M-P PRO"
  3. set "Product=%Product:.=_%"
  4. set "Product=%Product: =_%"
  5. echo,%Product%
  6. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
chishingchan + 1 谢谢解答!

查看全部评分

发表于 2025-7-28 12:51:13 | 显示全部楼层
本帖最后由 yakeyun 于 2025-7-28 19:29 编辑

回复 1# chishingchan
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. :: 检查管理员权限
  4. net session >nul 2>&1
  5. if %errorLevel% neq 0 (
  6.     echo 请使用管理员权限运行此脚本!
  7.     pause
  8.     exit /b
  9. )

  10. :: 获取当前计算机名
  11. for /f "tokens=*" %%a in ('hostname') do set "OLD_NAME=%%a"
  12. echo,当前设备名称: %OLD_NAME%

  13. ::获取主板名称并处理格式
  14. for /f "tokens=*" %%x in ('powershell -Command "(Get-CimInstance Win32_BaseBoard).Product"') do set "zbname=%%x"
  15. set "zbname=%zbname: =_%"
  16. set "zbname=%zbname:.=_%"
  17. set "zbname=%zbname:/=_%"
  18. set "zbname=%zbname:(=_%"
  19. set "zbname=%zbname:)=_%"
  20. set "NEW_NAME=!zbname!"
  21. echo,应用设备名称: !NEW_NAME!

  22. :: 设备名称 (%NEW_NAME%最多15字符,允许字母/数字/连字符)

  23. :: 基础验证
  24. if "!NEW_NAME!"=="" (
  25.     echo 错误:名称不能为空
  26.     pause
  27.     exit /b
  28. )
  29. if "!NEW_NAME!"=="%OLD_NAME%" (
  30.     echo 错误:新名称与当前名称相同
  31.     pause
  32.     exit /b
  33. )

  34. :: 使用PowerShell修改计算机名
  35. powershell -Command "Rename-Computer -NewName '%NEW_NAME%' -Force -ErrorAction Stop" 2>nul
  36. rem 如果要把名称中加入“Product=”,请将下面rem字段删除
  37. rem powershell -Command "Rename-Computer -NewName 'Product=%NEW_NAME%' -Force -ErrorAction Stop" 2>nul

  38. if %errorLevel% equ 0 (
  39.     echo 设备名称已成功修改为: %NEW_NAME%
  40.     echo 注意:需重启计算机生效!
  41.     rem 如果要自动重启,请将下面rem字段删除
  42.     rem shutdown /r /t 0
  43.     set /p REBOOT="是否立即重启?(y/n): "
  44.     if /i "!REBOOT!"=="y" shutdown /r /t 0
  45. ) else (
  46.     echo 修改失败!可能原因:
  47.     echo 1. 名称包含非法字符
  48.     echo 2. 名称长度超过15字符
  49.     echo 3. 名称包含空格或特殊符号
  50.     echo 4. 组策略限制
  51.     pause
  52. )

  53. endlocal
复制代码

评分

参与人数 1技术 +1 收起 理由
chishingchan + 1 识题解答,谢谢!

查看全部评分

发表于 2025-7-28 14:17:33 | 显示全部楼层
回复 3# chishingchan
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p "input=请输入原始计算机名称:"
  4. set "output=!input: =_!"
  5. set "output=!output:.=_!"
  6. set "output=!output:\=_!"
  7. set "output=!output:/=_!"
  8. set "output=!output::=_!"
  9. set "output=!output:*=_!"
  10. set "output=!output:?=_!"
  11. set "output=!output:"=_!"
  12. set "output=!output:<=_!"
  13. set "output=!output:>=_!"
  14. set "output=!output:|=_!"
  15. set "output=!output:,=_!"
  16. if "!output!"=="" (
  17.     set "output=_"
  18. ) else (
  19.     set "output=!output:~0,15!"
  20. )
  21. echo.
  22. echo 处理结果:
  23. echo 原始名称:%input%
  24. echo 规范名称:!output!
复制代码

评分

参与人数 1技术 +1 收起 理由
chishingchan + 1 不使用 PS,条件充足,完美解答!不知道 se ...

查看全部评分

发表于 2025-7-28 19:31:18 | 显示全部楼层
回复  chishingchan
yakeyun 发表于 2025-7-28 12:51



加入了将“Product=”字段加入功能,删除改名命令前的“rem”字符即可。
 楼主| 发表于 2025-7-28 20:05:58 | 显示全部楼层
鉴于以上的解答,可不可以不使用:
PowerShell
setlocal enabledelayedexpansion

set 能不能在 for 内
预设:Name=A/B\C*D?E"F<G>H|I,J.K L:M-N

如果不使用 setlocal,特殊字符可能不能应用某些字符,例如 < > | * ?
预设只是尽大程度包含所有不合适的字符,如果鉴于主板的名称,可能仅包含3~4种字符,特殊字符更是没有!
发表于 2025-7-29 00:12:04 | 显示全部楼层
回复 9# chishingchan

不用纯批的逐字遍历方法,也不用外部脚本如 vbs/jscript/powershell 方法,可尝试如下代码,但有一难点是不能替换*字符...

  1. @echo off
  2. set z=A/B\C*D?E"F^<G^>H^|I,J.K L:M-N
  3. set "z=%z:"=_%"
  4. set "z=%z:|=_%"
  5. set "z=%z:<=_%"
  6. set "z=%z:>=_%"
  7. set "z=%z:^=%"
  8. set "z=%z:?=_%"
  9. set "z=%z:\=_%"
  10. set "z=%z:/=_%"
  11. set "z=%z:,=_%"
  12. set "z=%z:.=_%"
  13. set "z=%z: =_%"
  14. set "z=%z::=_%"
  15. echo,"%z%"&exit/b
复制代码

评分

参与人数 2技术 +2 收起 理由
chishingchan + 1 这个很好!
holley + 1 赞一个!

查看全部评分

 楼主| 发表于 2025-7-29 16:13:54 | 显示全部楼层
回复 10# aloha20200628


    请问:
    1、第 7 行的作用是什么?
    2、能使用 FOR %variable IN (set) DO command 循环吗?
发表于 2025-7-29 17:10:28 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-7-29 19:23 编辑

回复 11# chishingchan

一。由于代码第2行采用字面量定义被处理字符串的预设值,故须对管道符和重定向符加持转义符^,因此代码第7行即为及时清理遗留的转义符,若要省略此行,须改用以下代码(运行结果会将被处理字符串中非英文字母均替换为 _,但 * 字符除外)。

  1. @echo off
  2. set z=A/B\C*D?E"F^<G^>H^|I,J.K L:M-N
  3.         set "z=%z:"=_%"
  4.         set "z=%z:^|=_%"
  5.         set "z=%z:^<=_%"
  6.         set "z=%z:^>=_%"
  7.         set "z=%z:?=_%"
  8.         set "z=%z:\=_%"
  9.         set "z=%z:/=_%"
  10.         set "z=%z:,=_%"
  11.         set "z=%z:.=_%"
  12.         set "z=%z: =_%"
  13.         set "z=%z::=_%"
  14.         set "z=%z:-=_%"
  15. echo,%z%&exit/b
复制代码
二。采用 for %%v in (...) 句式实现重复替换操作会引入延迟变量 setlocal enable...,否则会使代码复杂化,且通配符?*不能出现在 (...) 表达式中以免被系统强行转义为文件目录符匹配。
三。因 * 和 = 作为字符串替换函数的内置语义符,故采用字符串替换函数不能替换 * 和 =,好在硬件名称中不会采用之,本帖实况即可忽略了...
发表于 2025-7-29 18:18:54 | 显示全部楼层
本帖最后由 77七 于 2025-7-29 20:17 编辑

批处理把计算机重命名为主板名
  1. @echo off
  2. rem "右键管理员执行"
  3. for /f "tokens=1* delims==" %%a in ('wmic baseboard get Product /value ^|find "="') do (
  4.         for /f tokens^=1-8delims^=_./\:*?^"^<^>^|^,^  %%a in ('echo "%%b"') do (
  5.                 for /f "delims=" %%a in ("%%a.%%b.%%c.%%d.%%e.%%f.%%g.%%h") do (
  6.                         set str=%%~nxa
  7.                 )
  8.                 setlocal enabledelayedexpansion
  9.                 set "str=!str:.=_!"
  10.                 wmic computersystem where name="!COMPUTERNAME!" call rename name="!str:~0,15!"
  11.                 endlocal
  12.         )
  13. )
  14. pause
复制代码

代码没有直接替换这些字符,而是当作分隔符(相当于 多个相邻的分隔符替换成一个,并删除首尾的分隔符号) ,也与计算机名称有长度限制,为保留更多主板名称信息的实际需要契合。
wmic代码由ai提供,部分修改。忘了限制字符数了,已修改。

评分

参与人数 1技术 +1 收起 理由
chishingchan + 1 非常整洁

查看全部评分

发表于 2025-7-29 20:12:32 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-7-29 20:14 编辑

回复 11# chishingchan

如果是为修改有严格命名规则的计算机名称,确实不必如此修理这些特殊字符,但楼主有兴趣问究,就随之跟进吧...
以下代码是用 延迟变量+for... 重写的12楼代码,运行结果会将被处理字符串中非英文字母均替换为 _,但 * 字符除外。

  1. @echo off &setlocal enabledelayedexpansion &set "_#?=1" &set "_#"=1"
  2. for %%c in ("^<", "^>", "^|", "/", "", ",", ".", ":", "-") do set "_#%%~c=1"
  3. set z=A/B\C*D?E"F^<G^>H^|I,J.K L:M-N
  4. for /f "delims=_#=" %%a in ('set _#') do set "z=!z:%%a=_!"
  5. echo,!z!&exit/b
复制代码
最后再给一个用 for /f 分割法替换 * 和 = 两个钉子户的示例代码(均替换为 _ 字符),用此收尾以上代码或12楼代码即可最终搞定目标字符串中的 * 字符。

  1. @echo off &set "zz=" &set "z=abc*xyz=123"
  2. :zzz
  3.    for /f "tokens=1* delims=*=" %%a in ("%z%") do set "a=%%a" &set "z=%%b"
  4.    set "zz=%zz%_%a%"
  5.    if "%z%"=="" echo,%zz:~1%&exit/b
  6.    goto :zzz
复制代码

评分

参与人数 1技术 +1 收起 理由
chishingchan + 1 越来越精辟,谢谢!

查看全部评分

 楼主| 发表于 2025-7-30 19:53:10 | 显示全部楼层
回复 14# aloha20200628


    按本例的“主板产品名称”,得到真实的字符串一般没多少个特殊字符,够用就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 06:04 , Processed in 0.013678 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表