CMD命令列管道命令

2022-01-15 14:47:49 字數 3991 閱讀 9806

一、什麼是管道命令

管道命令能夠將乙個命令的執行結果經過篩選,只保留我們需要的資訊。

如 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,064k//

很清楚吧,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理解:cmd使用預設的標準輸入,執行,碰到end,則追加,但是標準輸入輸出

不能追加,於是出錯退出.

注:經試驗理解不對,據linux shell程式設計25章的說法,

這是shell定的語法.可以直接理解成end為分隔符.

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

Linux Unix 命令列 管道與過濾

在unix系統中,管道是一種先進先出的單向資料通路.利用管道符號 可以把乙個命令的標準輸出連線到另乙個命令的標準輸入.例如,利用管道把ls和wc兩個命令連線到一起,可以得到指定目錄下的檔案數量.ls usr wc w 重上述命令的執行效果看,可以把組合命令分解為以下兩個命令 ls usr fname...

使用subprocess執行命令列,管道阻塞

python中使用subprocess執行一系列cmd命令時,偶爾會出現阻塞情況,命令沒有繼續執行完畢。原因 subprocess的pipe是有大小的。在python2.6.11之前,pipe的大小為檔案頁的大小 i386上是4096 2.6.11之後變為65536.因此當輸出內容超過65536,會...

git 命令列 和 cmd命令列

設定全域性使用者名稱 git config global user.name 區域性把global換成local 檢視全域性 git config global list 檢視git的狀態 git status 初始化 git into 名字 新增乙個檔案 git add readme.txt 刪除...