zoukankan      html  css  js  c++  java
  • CMD命令行管道命令

    一、什么是管道命令
      管道命令能够将一个命令的执行结果经过筛选,只保留我们需要的信息。
      如 dir 命令会显示目录下所有文件夹和文件,可以使用管道命令| findstr "" 将dir的结果进行筛选,只保留需要的信息

     

    二、管道命令的使用

    1、Windows netstat 查看端口、进程占用

    // 假如我们需要确定谁占用了我们的9050端口
    
    C:/>netstat -aon|findstr "9050"
    
    TCP 127.0.0.1:9050 0.0.0.0:0 LISTENING 2016
    
    
    // 看到了吗,端口被进程号为2016的进程占用,继续执行下面命令:
    
    C:/>tasklist|findstr "2016"
    
    tor.exe 2016 Console 0 16,064 K
    
    // 很清楚吧,tor.exe 占用了你的端口

    2、查看文件夹目录结构

    tree > list.txt
    
    tree /f >list.txt

    3、输入输出重定向

    echo -c   // -c:不换行,linux下则是-n

    输入输出重定向:

        每执行一个命名,都会有3个与之相关的文件.标准输入文件,标准输出文件,错误输出文件.

        因为unix/linux下把任何一个设备都当作文件看待,所有实际上标准输入文件是键盘,

        标准输出和错误输出文件是屏幕.

    >      输出重定向

    <      输入重定向

    <<   输入追加

    >>   输入追加

    文件描述符:

        每一个文件可以用文件描述符来描述,系统提供12个,3-9可以任意定义.0-2系统定义如下:

    0  标准输入  键盘

    1  标准输出  显示器

    2  错误输出  显示器

    即可以用0-2代表上面的3个文件.

    例如:cmd>file     //cmd的输出重定向到file文件

         cmd>>file    //cmd的输出追加到file中,无则创建

         cmd 1>file   //把运行cmd的shell的标准输出重定向到file中,1代表标准输出

         cmd>file 2>&1  //把cmd的输出重定向到file,同时把2(错误输出)重定向到1(标准输出).

                                       2 > 1 则会把1当成文件,所有把错误定向到1必须使用&1.

         cmd 2>file    //把错误输出定向到file中

         cmd>>file 2>&1  //把错误和cmd输出追加到file中,cmd>>file,追加;2>&1,错误定向到

                                           标准输出,标准输入又追加到file中,所以错误和cmd输出都追加到file

         cmd 1>>file 2>&1  //可以把此命令等效于上一个命令

         cmdfile2   //cmd的输入是file1,结果输出到file2

         cmd<<END          //cmd使用标准输入,直到遇到END则退出.END可为任意一个字符

                                     理解:cmd使用默认的标准输入,运行,碰到END,则追加,但是标准输入输出

                                     不能追加,于是出错退出.

                                注:经试验理解不对,据linux shell编程25章的说法,

                               这是shell定的语法.可以直接理解成END为分隔符.

         cmd<&m          //把文件描述符m作为cmd的输入

         cmd>&m          //把文件描述符m作为cmd的输出

         cmd<&-          //关闭标准输入.

    !!!注意:

    1. 输入输出定向符前面不要加空格,否则容易出意想不到的问题

    2. 0 1 2不能使用>>或<<定向符,例: 2>>&1 出错

     

    4、for循环命令

        格式:FOR [参数] %%变量名 IN (相关文件或命令) DO 执行的命令
    
        // 作用:对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果。
    
        // 注意:在批处理文件中使用 FOR命令时,指定变量请使用%%variable,而不要用%variable。变量名称是区分大小写的,所以 %i 不同于 %I.
    
        // 关于:for命令可以带参数或不带参数,带参数时支持以下参数:/d /l /r /f

    实例

    咱们用一个实例来熟悉下for循环的用法。将ports-desc.txt中的端口号取出来存入另一个文件ports.txt文件中,代码:

    ports-desc.txt内容如下:

    1 传输控制协议端口服务多路开关选择器 2 compressnet 管理实用程序 3 压缩进程 5 远程作业登录 ...

    首先 新建一个bat文件test.bat(在cmd窗口直接输入名称运行),获取文件每行的信息,用到一个循环:

    @echo offfor /f "tokens=1* delims=:" %%i in ('findstr /n ".*" basic_port.txt') do ( echo %%j))pause打印:1:1 传输控制协议端口服务多路开关选择器 2:2 compressnet 管理实用程序 3:3 压缩进程 4:5 远程作业登录 ...

    因为使用了/n参数,所以每行首有序列号及冒号。这里详解下:

    ('findstr /n ".*" basic_port.txt') 会返回多行信息类似数组,for循环遍历每行字符串

    delims=: 代表将每行字符串利用=后的字符进行分割

    tokens=1* 1表示取每行分割后的第一列(可以理解为数组第一个arr[0])并存入变量%%i,后面所有的元素存入$$j()

    以第一行为例,%%i等于1;$$j等于“1 传输控制协议端口服务多路开关选择器”

    其次,遍历每行字符串,因此需要用到第二个循环,并且嵌套在其中:

    第二个循环命令中,需要使用第一个循环%%j(即每行字符串)的值,必须使用变量的方式。而一般变量表示为%变量%,这里比较特殊,需要用!变量!的方式。像这样:

    %%k in ("!string!") do(code...)

    现在代码为:

    @echo offfor /f "tokens=1* delims=:" %%i in ('findstr /n ".*" basic_port.txt') do ( set set string=%%j for /f "tokens=1* delims= " %%k in ("!string!") do ( echo %%k ))pause打印:!string!!string!!string!!string!!string!...

    运行后,结果不对。度娘后发现嵌套循环的问题:变量延迟。需要在第一行加上“setlocal enabledelayedexpansion”

    加上后:

    @echo off&;setlocal enabledelayedexpansionfor /f "tokens=1* delims=:" %%i in ('findstr /n "^[0-9]* " basic_port.txt') do ( set string=%%j for /f "tokens=1* delims= " %%k in ("!string!") do ( echo %%k ))pause

    现在就可以把数据一条条存入目标文件ports.txt文件中:

    最后代码:

    @echo off&;setlocal enabledelayedexpansionfor /f "tokens=1* delims=:" %%i in ('findstr /n "^[0-9]* " basic_port.txt') do ( set string=%%j for /f "tokens=1* delims= " %%k in ("!string!") do ( %%k>>ports.txt ))pause

    >> 表示将数据追加到文件中。首次会新建这个文件。

    > 一个时表示直接覆盖

     

     

     

     

     

     

    参考

    cmd下过滤文件名称的两种方法

    CMD管道命令使用

  • 相关阅读:
    对自己负责~~
    继续负责
    问题的一天
    1个月=22年
    刚才写的没显示?
    布置任务
    心情很糟
    考试结束
    没有负责哈
    php获取任意时间的时间戳
  • 原文地址:https://www.cnblogs.com/code1992/p/11654218.html
Copyright © 2011-2022 走看看