[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[特效代码] [已解决]BAT脚本:关于goto跳转的问题求助

BAT小白。想弄个交互式更改计算机名的批处理,当判断到计算机名的字符串大于15个字符时跳转到脚本开头重新要求用户数据计算机名,直到符合要求后执行后面的更改注册表操作。脚本如下所示,但现在无论是否大于15个字符只要按回车都会继续执行后面的脚本,还请大神们帮忙看下问题出在哪里。
  1. :gethostname
  2. cls
  3. title 初始化:更改计算机名
  4. set /p "cmpy=请键入设备所属的公司名(限制5个字符):"
  5. set /p "usag=请键入设备的用途(限制5个字符):"
  6. set "srvnm=adv-%cmpy%-%usag%"
  7. set /p "=该设备将被重命名为:%srvnm%,请确保其不多于15个字符。" <nul & echo,
  8. call:GetStrLen %srvnm%
  9. if %n% gtr 15 goto gethostname
  10. echo 正在更新注册表。
  11. reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ComputerName\ActiveComputerName" /v ComputerName /t reg_sz /d %name% /f >nul 2>nul
  12. reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t reg_sz /d %name% /f >nul 2>nul
  13. reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters" /v Hostname /t reg_sz /d %name% /f >nul 2>nul
  14. echo 注册表更新完成。
  15. goto:eof
  16. ::获取字符串长度
  17. :GetStrLen
  18. setlocal enabledelayedexpansion
  19. set /a max=8190,min=0
  20. for /l %%a in (1,1,14) do (
  21.     set /a "num=(max+min)/2"
  22.     for /f "delims=" %%b in ("!num!") do (
  23.         if "!str:~%%b!" equ "" (set /a max=num) else set /a min=num
  24.     )
  25. )
  26. if "!str:~%num%!" neq "" set /a num+=1
  27. endlocal & set "%1=%num%"
  28. pause>nul
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 7# lemoncn


shell的坑也不小
bash
ksh
csh
sh
不同的系统命令的具体参数和功能也不同
......
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# Batcher


感觉还是linux的shell 用着舒服
不想bat一样 风格各种不统一 一个又一个的大坑

TOP

回复 5# lemoncn


    任何系统在执行脚本的时候都有概率出现各种各样的问题
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

问题终于解决了 不过windows在执行脚本的时候总是有概率出现各种各样的问题
以下脚本分别在2003、2008中测试通过并能修改计算机名且限定在15个字符内
  1. :gethostname
  2. cls
  3. color 3f
  4. title 初始化:更改计算机名
  5. set /p "cmpy=请键入设备所属的公司名(限制5个字符):"
  6. set /p "usag=请键入设备的用途(限制5个字符):"
  7. ::这里使用了两个变量,因为%srvnm%在做过字符偏移的操作后被赋值为0了。
  8. set "name=adv-%cmpy%-%usag%"
  9. set "srvnm=adv-%cmpy%-%usag%"
  10. if "%srvnm:~15%" neq "" (echo,大于15字符.任意键返回重试&&pause>nul&&goto :gethostname) else echo "新设备名为:%name%,重启生效。"
  11. echo 正在更新注册表。
  12. reg add "HKLM\System\CurrentControlSet\Control\ComputerName\ActiveComputerName" /v ComputerName /t reg_sz /d %name% /f >nul 2>nul
  13. reg add "HKLM\System\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t reg_sz /d %name% /f >nul 2>nul
  14. reg add "HKLM\System\CurrentControlSet\Services\Tcpip\Parameters" /v Hostname /t reg_sz /d %name% /f >nul 2>nul
  15. echo 注册表更新完成。
  16. pause
复制代码

TOP

回复 3# lemoncn


第一,把这个 /a 删掉,否则可能会执行减法运算:
set /a "srvnm=srv-%cmpy%-%usag%"

第二,goto 后面加个空格:
goto :gethostname
1

评分人数

    • lemoncn: 问题解决了 多谢技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# apang
问题追加,已经改成字符偏移了。请问在if执行的操作里面,如果大于15个字符,怎么加上个提示大于15个字符,返回重试,并退到gethostname标签呢。下面的“echo,大于15字符.任意键返回重试&&pause>nul&&goto:gethostname”这一句并不能返回到gethostname标签而是继续执行。
  1. :gethostname
  2. cls
  3. color 3f
  4. title 初始化:更改计算机名
  5. set /p "cmpy=请键入设备所属的公司名(限制5个字符):"
  6. set /p "usag=请键入设备的用途(限制5个字符):"
  7. set /a "srvnm=srv-%cmpy%-%usag%"
  8. if "%srvnm:~15%" neq "" (echo,大于15字符.任意键返回重试&&pause>nul&&goto:gethostname) else echo "新设备名为:%srvnm%,重启生效。"
  9. echo 正在更新注册表。
  10. reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ComputerName\ActiveComputerName" /v ComputerName /t reg_sz /d %srvnm% /f >nul 2>nul
  11. reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t reg_sz /d %srvnm% /f >nul 2>nul
  12. reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters" /v Hostname /t reg_sz /d %srvnm% /f >nul 2>nul
  13. echo 注册表更新完成。
  14. goto ActCnf
复制代码

TOP

call 的参数为n 不是%srvnm%
str 应换成 srvnm

如果要判断字串长度是否大于或小于一个固定值,不必计算长度,用字符偏移即可:
set /p Input=输入:
if "%Input:~15%" neq "" (echo,大于15字符) else (echo,小于等于15字符)
1

评分人数

    • lemoncn: 乐于助人 感谢大神技术 + 1

TOP

返回列表