分享

命令行for示例

 问道东轩 2017-10-08
@Echo Off&Setlocal Enabledelayedexpansion
For /f "delims=" %%i in ('curl -s  "网址" ^| iconv -f utf-8 -t gb2312'do (
Set "i=%%i"
Echo !i!
)
Pause

用for命令就可以了,不用单独提取什么吗?例如:查询结果

追问

提取结果:

  1. @echo off&setlocal enabledelayedexpansion

  2. for /f "tokens=1,4 delims=<>" %%a in ('curl -s  "http://wap.ip138.com/ip.asp?ip=%1" ^| iconv -f

  3. utf-8 -t gb2312 ^| find "查询结果"') do (

  4. echo %%a

  5. echo %%b

  6. )

     

谢谢

----------------------------

测试:发现没有/f参数时,in中的命令将不会执行而视为文本

for /f %%a in ('whoami') do set username = %%a
echo 登录 %username% %date% %time% >>E:\文档\开关机时间.txt

-++++++++++++++++++++++++++++++++++++++++++++++

判断多个网卡

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1,2 delims=:" %%a in ('ipconfig /all^|find "Default Gateway"^|sort /r') do (
  4.     if not defined line_str set line_str=%%b
  5. )
  6. echo 本机的网关地址为:!line_str!
  7. 复制代码
--------------------------------------
dos环境下,需要变通一下,用for语句把执行结果赋给环境变量:
FOR /F %%i IN ('hadoop classpath') DO @set SPARK_DIST_CLASSPATH=%%i

实验环境是win10。注意,for语句用在批处理命令中时,需要连用两个%。

也可以用反引号来把需要执行的命令引起来,这时候,需要加参数usebackq:

FOR /F "usebackq" %%i IN (`hadoop classpath`) DO @set SPARK_DIST_CLASSPATH=%%i
-------------
我是想判断系统环境变量里面一个名字叫做“xxx”的是否存在,如果存在,我要看他的值跟一个字符串是否相等,相等就不改变他的值,不想等我就改变,如果不存在,我就新增这个名为xxx的系统变量。是这样的,但不一定是path这个特殊的,可能是其他用户添加的系统变量,比如JAVA_HOME 或者其他的。
追答
用BAT的SET命令截取和判断字符是非常蛋疼的,劝你还是想想别的招吧。
追问
其实不复杂,就是怎么得到xxx的值并赋值给a,之后我自有办法判断。这也是为什么我提问题直击重点。
追答
1
2
3
4
5
6
@echo off
for /f "delims搜索=" %%a in ('wmic ENVIRONMENT WHERE "Name='path'and UserName='<System>'" GET VariableValue^|findstr "system32"'do (
set "a=%%a"
call echo %%a%%
)
pause
------------------
@echo off&setlocal enabledelayedexpansion
for /f "delims==" %%i in (e:\test.txt) do (
    set /a n+=1
    set !n!=%%i
)
set /p a=请输入要提取的行数:
cls&echo 你所提取的行为:!%a%!
这是原来的代码使用来显示test.txt文件里的任意一行请,解释一下 delims==
pause>nul


for /f "eol= tokens=1,2 delims= " %%i in (ip.txt) do s syn %%i %%j 4899 /save
for /f "eol=- tokens=1 delims= " %%i in (result.txt) do echo %%i>>s1.txt
for /f "eol=P tokens=1 delims= " %%i in (s1.txt) do echo %%i>>s2.txt
for /f "eol=S tokens=1 delims= " %%i in (s2.txt) do echo %%i>>ips.txt
------------------
在cmd窗口下for/? 就可以看到for的帮助信息了。
第一个for语句来说参数
/f 是说明对括号中的e:\test.txt进行逐行分析
eol参数本来是用来指定以某个符号开头的字符当中注释行,并不读取
tokens=1,2 指定只取ip.txt中的第一和第二列,应为取了两列,所以需要两个参数来接收取出来的值。第二个参数由第一个参数决定。假设第一个参数为%%a,那么第二个参数就是%%b,以此类推。
----------------------------------------------
delims是分割标示属性,=后面的字符作为分割set集中的标记,=后面可跟多个字符,默认为空格或tab制表位等空白内容。
delims==,?
则表示以=,?这三个符号为分隔符 搜索
----------------------------------------
do s syn 貌似是错的,没有s syn 这个命令。
可以是这样:for /f "eol= tokens=1,2 delims= " %%i in (ip.txt) do echo %%i %%j

将text文本中每一行=前的所有内容赋值给变量n,若这行中没有=,则把这行所有内容赋值给n,n为从1开始的阿拉伯数字
然后用!%a%!来取出变量中内容。


---------------------
下面举个例子,假设ip.txt中的内容为
1 2 3 4 5
a a a a a
;a a a a
ab b b b b
那么执行
for /f "eol= tokens=1,2 delims= " %%i in (ip.txt) do echo %%i %%j
显示的结果为1 2a a:a ab b看到了吗?只显示第一列和第二列,

但是如果执行的是for /f "tokens=1,2 delims= " %%i in (ip.txt) do echo %%i %%j,
那么显示结果就变为了1 2a ab b以分号开头的aa不见了,这就是因为默认忽略以分号开头的行,
假设改为搜索 for /f "eol=a tokens=1,2 delims= " %%i in (ip.txt) do echo %%i %%j,那么显示结果就变为了1 2:a ab b以a开头的那一行就被忽略了。再说那两个参数如果你只用%%i而不用%%j,那么你会发现,只显示第一列,这是因为没有接受第二列的参数至于delims指定分隔符,看这个例子a,b c;d用for /f "delims= " %%i in (ip.txt) do echo %%ifor /f "delims=," %%i in (ip.txt) do echo %%ifor /f "delims= ;" %%i in (ip.txt) do echo %%i分别执行以下,应该就会明白了

---------------------
1
2
3
4
5
:: for /f "tokens=1,2,3,4 delims=/ " %%a in ("%date%"do set mt=%%a
:: 意思为 将date时间的前4位赋值给变量mt,应该是2015
:: set d=%%b&set yr=%%c
:: 将%%b的结果赋值给变量d,将%%c的结果赋值给变量yr
:: GAGATOSHUT团队

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多