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管道命令使用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM