Board logo

标题: [文本处理] 批处理如何截取ip地址值的前2位? [打印本页]

作者: ditto    时间: 2014-8-28 10:32     标题: 批处理如何截取ip地址值的前2位?

比如某变量a值为 192.168.1.2

截取后192.168赋予变量b

求赐教!
作者: Linuxer    时间: 2014-8-28 10:38

  1. set a=192.168.1.2
  2. set b=%a:~0,7%
复制代码

作者: ditto    时间: 2014-8-28 10:57

Linuxer 发表于 2014-8-28 10:38



    ip也有可能10.112.1.1 这样哦 不是7位
作者: Linuxer    时间: 2014-8-28 12:28

回复 3# ditto


    那就用for循环
  1. @echo off
  2. set a=10.112.1.1
  3. for /f "delims=. tokens=1,2" %%i in ("%a%") do (set b=%%i.%%j)
  4. echo %b%
  5. pause
复制代码

作者: 牛虻    时间: 2014-8-28 12:37

如何获取ip地址?
作者: terse    时间: 2014-8-28 13:13

  1. @echo off & setlocal enabledelayedexpansion
  2. set "a=192.168.1.2"
  3. set b=%a:*.=%
  4. set b=!a:.%b%=!.!b:.%b:*.=%=!
  5. echo %b%
  6. pause
复制代码

作者: Linuxer    时间: 2014-8-28 13:39

本帖最后由 Linuxer 于 2014-8-28 13:42 编辑

回复 5# 牛虻
win7
  1. @echo off
  2. for /f "delims=: tokens=2" %%i in ('ipconfig ^| find /i "IPv4"') do echo %%i
  3. pause>nul
复制代码
xp
  1. @echo off
  2. for /f "delims=: tokens=2" %%i in ('ipconfig ^| find /i "IP Address"') do echo %%i
  3. pause>nul
复制代码

作者: 523066680    时间: 2014-8-28 14:29

本帖最后由 523066680 于 2014-8-28 14:41 编辑

前两节,前两段。。。
  1. @echo off
  2. set ip=192.168.1.1
  3. call :next %ip:.= %
  4. pause
  5. exit
  6. :next
  7.     echo %1.%2
复制代码

作者: Linuxer    时间: 2014-8-28 15:09

回复 8# 523066680


  哈哈,%1,%2用起来真爽,,,学习了。
作者: CrLf    时间: 2014-8-28 15:20

继续放出另类解...
  1. @echo off
  2. set ip=192.168.1.1
  3. (set b=)&(set a=%ip:.=)&(if not defined b set b=%)
  4. echo %a%.%b%
  5. pause
复制代码

作者: CrLf    时间: 2014-8-28 15:38

回复 8# 523066680


来一个
  1. @echo off
  2. %1 set ip=192.168.1.1
  3. %1 %0 : %ip:.= %&eixt/b
  4. echo %2.%3
复制代码
我蛋疼得...其实真还不如 call
作者: Linuxer    时间: 2014-8-28 15:43

回复 10# CrLf


    的确另类。。不太理解。。大神可否解释一二~~有关第三行的
  1. (set b=)&(set a=%ip:.=)&(if not defined b set b=%)
复制代码

作者: terse    时间: 2014-8-28 16:09

回复 12# Linuxer
我理解的流程是替换
执行语句是这样  不知对否
  1. set b=&(set a=192)&(if not defined b set b=168)&(if not defined b set b=1)&(if not defined b set b=2)
复制代码

作者: CrLf    时间: 2014-8-28 16:16

回复 12# Linuxer
  1. (set b=)&(set a=%ip:.=)&(if not defined b set b=%)
复制代码
分两部分解释下:
1、(set b=)
设置 %b% 为空
2、(set a=%ip:.=)&(if not defined b set b=%)
预处理时会将 %ip% 中的 . 替换为 )&(if not defined b set b=
这样就变成了:
  1. )&(if not defined b set b=168)&(if not defined b set b=1)&(if not defined b set b=1
复制代码
加上前后缀就是:
  1. (set a=192)&(if not defined b set b=168)&(if not defined b set b=1)&(if not defined b set b=1)
复制代码
------------------------------------------------------------------------------------------------
所以整行的作用相当于执行了
  1. set b=
  2. set a=192
  3. if not defined b set b=168
  4. if not defined b set b=1
  5. if not defined b set b=1
复制代码
这样就明了了吧
作者: CrLf    时间: 2014-8-28 16:23

本帖最后由 CrLf 于 2014-8-28 17:00 编辑

回复 13# terse


    是的~再来一个更精简的
  1. @echo off
  2. set ip=192.168.1.1
  3. (set a=%ip:.=)&&set 2>nul /a 1/!-~(b=%)
  4. echo %a%.%b%
  5. pause
复制代码
如果看不懂,去掉 @echo off 运行一下应该就差不多明白了
-~ 作用有点像 ++,用来兼容值为 0 的部分,相应的,~- 有点像 --,至于为什么...百度“按位取反”和“int 类型正负数的区别”
话说这代码可读性约等于 0,玩玩可以,练技巧活思路而已,终究不是正道
作者: 花落谁葬    时间: 2014-8-28 16:34

本帖最后由 花落谁葬 于 2014-8-28 16:41 编辑

回复 10# CrLf

思路巧妙,简短的代码丰富的技巧……厉害!
作者: 523066680    时间: 2014-8-28 17:33

本帖最后由 523066680 于 2014-8-28 17:36 编辑
  1. @echo off
  2. set str=192.168.10.255
  3. set b=%str:*.=%
  4. call echo %%str:.%b:*.=%=%%
  5. pause
复制代码

作者: CrLf    时间: 2014-8-28 17:40

接着玩
  1. @echo off
  2. set ip=192.168.1.1
  3. for %%a in (%ip%) do for %%b in (%%~na) do echo %%~na
  4. pause
复制代码

作者: yu2n    时间: 2014-8-28 19:14

回复  Linuxer 分两部分解释下:
1、(set b=)
设置 %b% 为空
2、(set a=%ip:.=)&(if not defined b set  ...
CrLf 发表于 2014-8-28 16:16

这……好复杂啊,病毒的感觉。
作者: 523066680    时间: 2014-8-28 20:42


作者: neorobin    时间: 2014-8-28 21:54

回复 20# 523066680
想到可以位运算
  1. set a=192.168.1.2
  2. set /a "x=(((%a:.=)<<8|%,p=x>>24&255,q=x>>16&255"
  3. echo %p%.%q%
  4. pause
复制代码

作者: CrLf    时间: 2014-8-29 03:47

回复 21# neorobin


思路巧妙!之前也想过位运算,但以为无法兼容第一节大于 127 的 ip,忘了位运算是不分正负数的
不过有点绕了,还可以再直接点:
  1. set a=192.168.1.1
  2. set /a "a=%ip:.=,b=c,c=d,d=%"
  3. echo %a%.%b%
  4. pause
复制代码

作者: neorobin    时间: 2014-8-29 08:38

回复 22# CrLf

想不出比 b=c,c=d,d= 这样变量接力更有趣的了

还是位运算,短了点,纯属娱乐
  1. set a=192.168.1.2
  2. set /a "p=%a:.=,q=q<<8|%,q>>=16"
  3. echo %p%.%q%
  4. rem 等效的四则运算
  5. set /a "p=%a:.=,q=q*256+%,q/=65536"
  6. echo %p%.%q%
复制代码

作者: terse    时间: 2014-8-29 11:19

用 /A 的话 再短点
  1. set "a=192.168.1.2"
  2. set /ab=a,p=%a:*.=%
  3. echo %b% %p%
复制代码

作者: CrLf    时间: 2014-8-29 15:27

回复 24# terse


赞~
试过这种办法,但没想到提示“运算符不存在。”的时候其实已经赋值了,学习了!
作者: apang    时间: 2014-8-30 10:57

各位大神好
我是来膜拜的!!!
作者: hnldwhm52    时间: 2014-9-11 23:31

xuexiliaoxiexie!!!




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