Board logo

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

作者: lemoncn    时间: 2014-6-30 18:40     标题: [已解决]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
复制代码

作者: apang    时间: 2014-6-30 19:46

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

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

回复 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
复制代码

作者: Batcher    时间: 2014-7-1 13:16

回复 3# lemoncn


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

第二,goto 后面加个空格:
goto :gethostname
作者: lemoncn    时间: 2014-7-2 13:08

问题终于解决了 不过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
复制代码

作者: Batcher    时间: 2014-7-2 13:12

回复 5# lemoncn


    任何系统在执行脚本的时候都有概率出现各种各样的问题
作者: lemoncn    时间: 2014-7-2 13:32

回复 6# Batcher


感觉还是linux的shell 用着舒服
不想bat一样 风格各种不统一 一个又一个的大坑
作者: Batcher    时间: 2014-7-2 13:42

回复 7# lemoncn


shell的坑也不小
bash
ksh
csh
sh
不同的系统命令的具体参数和功能也不同
......




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2