Powershell batch and command: tasklist

IMG_15072014_151944

tasklist 用來抓取process PID.

今天朋友出了一個問題:

[下午 02:06:38] 安佳脫脂奶粉: CMD有辦法作到偵測程式結束嗎?

我第一個反應就是去抓PID,然後去Monitor這個PID做判斷.
算時職業使然吧,在Linux下寫script去處理PID算是很經常的問題.
但是,今天換在Windows呢?我有哪些工具可以用是第一個問題.

 

“我跟Windows powershell不熟”
說來好笑,自身對於程式語言的歷程就是從DOS622上寫batch啟蒙.
當年如何在奔騰時代卻還在用486SX的我,想盡辦法要在僅有8M的RAM上玩遊戲.
於是config.sys autoexe.bat調MENU就是我學習語言的開始,也不過是自動開機選單.

但是後來在北興國中的資訊室接觸了Linux,高中還跑去台南聯成上梁楓的課.
到踏入了大學殿堂,Linux shell反而卻變成我最習慣的環境,一直到現在出社會.

扯遠了,重點是如何在指令介面得到PID? 孤狗永遠是最好的老師.
把PID, windows, command line丟進去找到這篇文章:

http://stackoverflow.com/questions/8435952/how-to-get-pid-from-command-line-filtered-by-username-and-imagename

太好了,有tasklist可以用.這樣就可以取得PID,剩下就是字串處理與邏輯的問題
甚至拿範例程式來兜成朋友想要的應該就可以了,我這麼想.

 

“沒想到是我思考的盲點”
寫Script習慣了豐富的linux shell提供的指令環境,處理與process有關就是針對PID
追蹤.於是怎麼把PID取下來再監看是我的直覺反應,但其實朋友要的只需要知道
process在不在,並不用刻意去記憶PID的.後來討論到如果實現了Monitor PID接下來要做什麼.
才想到return code, 於是tasklist會不會return error code是簡化整個batch的方向.
沒錯又是Google:
http://stackoverflow.com/questions/4969595/exit-status-of-tasklist-in-batch-file

直接把資料流導給find再讓find來return error level,這隻程式大致上就完成了.

IMG_15072014_155734

我系統上沒有firefox 所以errorlevel=1,正在執行chrome 所以return 0

寫這篇單純想留下個紀錄,搞不好那天我自己會用的到,畢竟對powershell不如linux bash熟
並提醒自己有時候思考邏輯會陷入憑藉經驗上的盲點卻不自知.
而朋友的鍥而不捨也才有後面引出,用errorlevel的方式查驗process name 並由find來定位,
汎洪的池塘通常由小小的石頭引起,不過得先要有足夠的水量開始,每次的筆記就是我小小的累積.

 

這是朋友的CODE範例:

@echo off
:ONE
	tasklist | find "SLDWORKS.exe"
	echo Error level = %ERRORLEVEL%
	if errorlevel=1 goto ONE
	if errorlevel=0 goto ZERO
	goto END
:ZERO
	cls
	echo a Zero was returned!
	pause
	goto END
:END

 
refer:
易學易用的 Windows PowerShell: http://www.microsoft.com/taiwan/technet/columns/profwin/28-monad.mspx
批次檔 ERRORLEVELs 的正確測試的優先順序: http://support.microsoft.com/kb/39585/zh-tw

Facebook Comments
Scottj Written by:

史考特 喜歡3C 愛拍照