标题: [文本处理] 批处理如何截取ip地址值的前2位? [打印本页]
作者: ditto 时间: 2014-8-28 10:32 标题: 批处理如何截取ip地址值的前2位?
比如某变量a值为 192.168.1.2
截取后192.168赋予变量b
求赐教!
作者: Linuxer 时间: 2014-8-28 10:38
- set a=192.168.1.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循环- @echo off
- set a=10.112.1.1
- for /f "delims=. tokens=1,2" %%i in ("%a%") do (set b=%%i.%%j)
- echo %b%
- pause
复制代码
作者: 牛虻 时间: 2014-8-28 12:37
如何获取ip地址?
作者: terse 时间: 2014-8-28 13:13
- @echo off & setlocal enabledelayedexpansion
- set "a=192.168.1.2"
- set b=%a:*.=%
- set b=!a:.%b%=!.!b:.%b:*.=%=!
- echo %b%
- pause
复制代码
作者: Linuxer 时间: 2014-8-28 13:39
本帖最后由 Linuxer 于 2014-8-28 13:42 编辑
回复 5# 牛虻
win7- @echo off
- for /f "delims=: tokens=2" %%i in ('ipconfig ^| find /i "IPv4"') do echo %%i
- pause>nul
复制代码
xp- @echo off
- for /f "delims=: tokens=2" %%i in ('ipconfig ^| find /i "IP Address"') do echo %%i
- pause>nul
复制代码
作者: 523066680 时间: 2014-8-28 14:29
本帖最后由 523066680 于 2014-8-28 14:41 编辑
前两节,前两段。。。- @echo off
- set ip=192.168.1.1
- call :next %ip:.= %
- pause
- exit
-
- :next
- echo %1.%2
复制代码
作者: Linuxer 时间: 2014-8-28 15:09
回复 8# 523066680
哈哈,%1,%2用起来真爽,,,学习了。
作者: CrLf 时间: 2014-8-28 15:20
继续放出另类解...- @echo off
- set ip=192.168.1.1
- (set b=)&(set a=%ip:.=)&(if not defined b set b=%)
- echo %a%.%b%
- pause
复制代码
作者: CrLf 时间: 2014-8-28 15:38
回复 8# 523066680
来一个- @echo off
- %1 set ip=192.168.1.1
- %1 %0 : %ip:.= %&eixt/b
- echo %2.%3
复制代码
我蛋疼得...其实真还不如 call
作者: Linuxer 时间: 2014-8-28 15:43
回复 10# CrLf
的确另类。。不太理解。。大神可否解释一二~~有关第三行的- (set b=)&(set a=%ip:.=)&(if not defined b set b=%)
复制代码
作者: terse 时间: 2014-8-28 16:09
回复 12# Linuxer
我理解的流程是替换
执行语句是这样 不知对否- 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 - (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=
这样就变成了:- )&(if not defined b set b=168)&(if not defined b set b=1)&(if not defined b set b=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)
复制代码
------------------------------------------------------------------------------------------------
所以整行的作用相当于执行了- 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=1
复制代码
这样就明了了吧
作者: CrLf 时间: 2014-8-28 16:23
本帖最后由 CrLf 于 2014-8-28 17:00 编辑
回复 13# terse
是的~再来一个更精简的- @echo off
- set ip=192.168.1.1
- (set a=%ip:.=)&&set 2>nul /a 1/!-~(b=%)
- echo %a%.%b%
- 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 编辑
- @echo off
- set str=192.168.10.255
- set b=%str:*.=%
- call echo %%str:.%b:*.=%=%%
- pause
复制代码
作者: CrLf 时间: 2014-8-28 17:40
接着玩- @echo off
- set ip=192.168.1.1
- for %%a in (%ip%) do for %%b in (%%~na) do echo %%~na
- 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
想到可以位运算- set a=192.168.1.2
- set /a "x=(((%a:.=)<<8|%,p=x>>24&255,q=x>>16&255"
- echo %p%.%q%
- pause
复制代码
作者: CrLf 时间: 2014-8-29 03:47
回复 21# neorobin
思路巧妙!之前也想过位运算,但以为无法兼容第一节大于 127 的 ip,忘了位运算是不分正负数的
不过有点绕了,还可以再直接点:- set a=192.168.1.1
- set /a "a=%ip:.=,b=c,c=d,d=%"
- echo %a%.%b%
- pause
复制代码
作者: neorobin 时间: 2014-8-29 08:38
回复 22# CrLf
想不出比 b=c,c=d,d= 这样变量接力更有趣的了
还是位运算,短了点,纯属娱乐- set a=192.168.1.2
- set /a "p=%a:.=,q=q<<8|%,q>>=16"
- echo %p%.%q%
- rem 等效的四则运算
- set /a "p=%a:.=,q=q*256+%,q/=65536"
- echo %p%.%q%
复制代码
作者: terse 时间: 2014-8-29 11:19
用 /A 的话 再短点- set "a=192.168.1.2"
- set /ab=a,p=%a:*.=%
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |