标题: [特效代码] [已解决]BAT脚本:关于goto跳转的问题求助 [打印本页]
作者: lemoncn 时间: 2014-6-30 18:40 标题: [已解决]BAT脚本:关于goto跳转的问题求助
BAT小白。想弄个交互式更改计算机名的批处理,当判断到计算机名的字符串大于15个字符时跳转到脚本开头重新要求用户数据计算机名,直到符合要求后执行后面的更改注册表操作。脚本如下所示,但现在无论是否大于15个字符只要按回车都会继续执行后面的脚本,还请大神们帮忙看下问题出在哪里。- :gethostname
- cls
- title 初始化:更改计算机名
- set /p "cmpy=请键入设备所属的公司名(限制5个字符):"
- set /p "usag=请键入设备的用途(限制5个字符):"
- set "srvnm=adv-%cmpy%-%usag%"
- set /p "=该设备将被重命名为:%srvnm%,请确保其不多于15个字符。" <nul & echo,
- call:GetStrLen %srvnm%
- if %n% gtr 15 goto gethostname
-
- echo 正在更新注册表。
- reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ComputerName\ActiveComputerName" /v ComputerName /t reg_sz /d %name% /f >nul 2>nul
- reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t reg_sz /d %name% /f >nul 2>nul
- reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters" /v Hostname /t reg_sz /d %name% /f >nul 2>nul
- echo 注册表更新完成。
- goto:eof
- ::获取字符串长度
- :GetStrLen
- setlocal enabledelayedexpansion
- set /a max=8190,min=0
- for /l %%a in (1,1,14) do (
- set /a "num=(max+min)/2"
- for /f "delims=" %%b in ("!num!") do (
- if "!str:~%%b!" equ "" (set /a max=num) else set /a min=num
- )
- )
- if "!str:~%num%!" neq "" set /a num+=1
- endlocal & set "%1=%num%"
- 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标签而是继续执行。- :gethostname
- cls
- color 3f
- title 初始化:更改计算机名
- set /p "cmpy=请键入设备所属的公司名(限制5个字符):"
- set /p "usag=请键入设备的用途(限制5个字符):"
- set /a "srvnm=srv-%cmpy%-%usag%"
- if "%srvnm:~15%" neq "" (echo,大于15字符.任意键返回重试&&pause>nul&&goto:gethostname) else echo "新设备名为:%srvnm%,重启生效。"
-
- echo 正在更新注册表。
- reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ComputerName\ActiveComputerName" /v ComputerName /t reg_sz /d %srvnm% /f >nul 2>nul
- reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t reg_sz /d %srvnm% /f >nul 2>nul
- reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters" /v Hostname /t reg_sz /d %srvnm% /f >nul 2>nul
- echo 注册表更新完成。
- 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个字符内- :gethostname
- cls
- color 3f
- title 初始化:更改计算机名
- set /p "cmpy=请键入设备所属的公司名(限制5个字符):"
- set /p "usag=请键入设备的用途(限制5个字符):"
- ::这里使用了两个变量,因为%srvnm%在做过字符偏移的操作后被赋值为0了。
- set "name=adv-%cmpy%-%usag%"
- set "srvnm=adv-%cmpy%-%usag%"
- if "%srvnm:~15%" neq "" (echo,大于15字符.任意键返回重试&&pause>nul&&goto :gethostname) else echo "新设备名为:%name%,重启生效。"
-
- echo 正在更新注册表。
- reg add "HKLM\System\CurrentControlSet\Control\ComputerName\ActiveComputerName" /v ComputerName /t reg_sz /d %name% /f >nul 2>nul
- reg add "HKLM\System\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t reg_sz /d %name% /f >nul 2>nul
- reg add "HKLM\System\CurrentControlSet\Services\Tcpip\Parameters" /v Hostname /t reg_sz /d %name% /f >nul 2>nul
- echo 注册表更新完成。
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |