發表文章

目前顯示的是有「powershell」標籤的文章

使用powershll和IECapt取得網頁瀏覽速度

前陣子在查個問題,我必須要取得瀏覽網頁時所需花費的時間作為釐清問題的參考依據。 一個網頁的呈現,簡單的講,在瀏覽器發出request後,逐一由網站取得html、css、javascript、圖檔等等。接者,瀏覽器會做解析、處理、執行、呈現。 先撇除使用者端因使用不同的瀏覽器、版本,造成網頁呈現速度不同的這個因素(當然還要剔除網路問題)。一般來講,網站主機端的軟硬體效能,以及html、css、javascript也深深影響網頁最後需要多少時間才能呈現… 以上詳細的過程,和相關技術,講起來簡單,其實又是另一門很深的功夫和學問。建議可以參考下面兩份資料 Yahoo - YSlow Google - Page Speed 因此,取得瀏覽網頁時所需花費的時間,必須要能儘量符合人們使用瀏覽器觀看網頁時的狀況。而不能使用wget這類的方式來測試單獨取得html的速度。思考了很久,最後還是使用 powershell 和 IECapt 。 簡單的說明一下作法…先提 IECapt ,他是一個在指令列(command-line)下執行的小工具程式。是透過 IE 去擷取特定的網頁畫面,並存成圖檔。也因此,使用 IECapt 同等於使用IE去瀏覽網頁。 接者,就只是很單純的利用 powershll去呼叫 IECapt 『瀏覽』網頁,並計算每次瀏覽網頁時時間。也就是計算呼叫起來,直到結束之間的時間差。 不過,在做長期監控時需要考量一點。就是每次測試時,無法確定在測試的當下,被測試的主機狀態如何?特別是下列兩種狀況。因此需要設定 time out 時間,避免測試時因下列狀況卡住 被測試的主機,當下因各種問題,造成反應異常緩慢。 當為此情況時,測試結果為time out 時間。 被測試的主機,當下已經無法提供服務(如,如法連線)。 當為此情況時,測試結果為0。 以下,就是測試速度的程式碼 附註: IECapt 有時會發生不明異常,而中斷。這點,目前我還沒比較好的解決方案… #避免留有之前測試所產生的圖檔 if ( Test-Path webservet_test.jpg){ remove-item $pwd \ $testcaptfile -force } #產生shell,準備開始測試 $WshShell = New-Object -ComObject W...

powershell模擬grep

最近要查份資料,需要由185M 的原始log檔案中,找出我要的關鍵字,並將有該關鍵字的那一行抓出來。做這樣的處理,馬上想到grep這指令。但…因為是使用windows的系統,只好查一下powhershell是否有grep或類似grep的指令。google一下,最後是使用 select-string 做到類似的效果。 處理完後,和一位對於shell script很熟的同事聊了一下剛剛這個處理。忽然間,有點好奇,如果用grep來處理會不會更快?於是再度把 Cygwin 裝起來,利用相同機器、資料做一樣的處理,做個小小的比較,整理如下表… Powershell grep @ Cygwin 指令 cat p_log.log | select-string "127.0.0.1" > mydata.log grep "127.0.0.1" p_log.log >mydata.log 處理時間 超過25秒 約2秒 CPU loading 持續約25% 約5% 結果,powershell的處理速度,實在遜太多了… 附註: 執行的機器硬體配備: CPU Intel Core2 Quad Q8200 2.33GHz RAM 4G Windows XP Powershell v1 Cygwin v1.5.25-15

PowerShell大量建立AD帳號

最近在Windows 2008上面玩AD(Active Directory),當相關設定完成後,就遇到一個問題-如何快速建立大量的帳號?雖然在 Windows Server 2008 Active Directory目錄服務 這本書中有提到可以使用 PowerShell、vbscript等方式都可以做。但有鑑於Windows 2008已經有內建PowerShell,以及他的彈性比較高,所以決定使用 PowerShell 加上 excel(帳戶資料)的模式來產生大量的AD帳號! 在此之前從未接觸過Windows 2008,一時間居然不知如何執行PowerShell!查了很久才知道所謂『Windows 2008內建PowerShell』,並非如我所想像的內建就已經安裝,還是要自己去勾選安裝。總之,將遇到的一些狀況記錄下來… 如何在Windows 2008內使用PowerShell 如何用PowerShell加上 excel(帳戶資料)建立帳號 如何看AD帳戶的屬性名稱 如何在Windows 2008內使用PowerShell 開啟系統管理工具,開啟伺服器管理員(Server Manager)、選擇新增功能(Add a Feature),將PowerShell 打勾,就可以安裝了 如何用PowerShell加上 excel(帳戶資料)建立帳號 基本的操作方式,可以參考 Windows PowerShell自動化目錄管理 這篇文章。裡面有介紹如何使用 Quest Software 結合Import-CSV方式快速建立資料。這個範例,雖然簡單短短一行就解決了。但是,裡面的範例實在『太基本』,在實用上還需要做些調整。 一個AD帳號,絕對不會只設定如範例中設定那麼少的屬性。以我的需求來講,我需要讓AD上面的帳號,在做第一次登入時,要『強迫更換密碼』!一開始,我是先找出這屬性所對應的屬性英文名稱…花了不少時間嘗試,才確定對應的屬性名稱為 - pwdLastSet,且必須設定為pwdLastSet=0。但很不幸的,怎麼設定都沒作用…(我覺得,應該是這個屬性無法再建立AD帳號時直接設定。但是再建立AD帳號後再去修改,就會生效。這個狀況,是讓我浪費很多時間在確定屬性是否真的為pwdLastSet) 後來無意間找到有文章指出,可以下參數 -UserMustChangePassword ...

用powershell實做wget

在unix-like系統上,有個wget,可以用來抓取遠方主機的檔案(如網頁)下來,然後做後續的處理…在windows除非特別去找軟體來裝,否則沒此工具可用。 最近在玩Flickr的API,需要這樣的功能。加上電腦上都有裝powershell。於是乎,就想利用powershell來模擬wget的處理。 一開始,寫了如下的function來使用… function wget([string]$url, [string]$file){    $client = new-object System.Net.WebClient    $client.DownloadFile($url, $file) } Flickr所回傳的XML是抓下來了。不過,因為他是web service,編碼是採用utf8。因此,抓下來的檔案中如果有中文字,不經轉碼直接拿來處理的話…不幸的,會有問題…… 因此,做如下的處理來轉碼。利用get-content 先將抓回來的檔案轉成utf8後,再去處理。這樣,XML才會正常! $dl_file=[System.IO.Path]::GetTempFileName() wget("http://url", $dl_file) [xml]$list = get-content $dl_file -encoding utf8 不過,玩到後來,因為每次所抓的資料不多,不想將Flickr API所傳回的資料存放在檔案內。想直接在記憶體內處理即可。但…怎麼找,都找不到一個簡單的轉字串編碼的處理方式。 只好還是乖乖K一下 MSDN ,沒想到,其實只要如下的一行設定,問題就輕鬆解決了! function wget([string]$url){    $client = new-object System.Net.WebClient    $client.Encoding = [System.Text.Encoding]::GetEncoding("utf-8")    return $client.DownloadString($url) } 修改後的wget,使用方式如下… $result=wget("http://url"...

如何使用 Microsoft Source Code Analyzer for SQL Injection 自動掃瞄處理整個目錄

Microsoft Source Code Analyzer for SQL Injection這工具只能針對單一檔案作處理。在實際處理上,實在很不方便…科技來自惰性,想了想,決定用powshell 來協助掃瞄目錄這段的處理。 由於要處理的目錄很多,索性把Microsoft Source Code Analyzer for SQL Injection所需的相關參數當作變數,每次掃瞄不同目錄時,在去異動變數即可!以下,就是完整的powershell 程式~ #參數設定 $para_GlobalAsaPath ="D:\www\test" $para_tocheckdir ="D:\www\test\test_sub" $para_Output ="D:\www\result.xml" #如果不設定,將會以cmd的初始路徑為依據 $para_IncludePaths ="D:\www\test\include" $para_tocheckext ="*.asp " #要檢測的附檔名 $para_sqlcheckprog ="D:\sp_sql_check\msscasi_asp.exe" #檢測工具存放路徑和程式名稱 $exe_cmd="" #組合指令 $g_exe_cmd="$para_sqlcheckprog /GlobalAsaPath=""$para_GlobalAsaPath"" /IncludePaths=""$para_IncludePaths"" /Output=""$para_Output"" /Append " #取得測試目錄下所有目錄 $array_files=Get-ChildItem -Name -Path $para_tocheckdir $para_tocheckext -Recurse clear #是否有檔案? if ($array_files -is [array]){  foreach ($filename ...

powershell下如何呼叫FTP,並等FTP作業完成

知道有powershell後,K了官方網站上所提供的文件後就來試試看。把原本一個作業改用powershell來處理,我只能說,雖然powershell跟以往比起來算跨了一大步,但是很多東西跟UNIX下來比還是礙手礙腳,當然也許跟我要處理的作業有關吧! 首先,我遇到的問題,就是要利用FTP,去取得遠方的資料回來處理。查了一下,有個要$的可以用,但一想到$還是算了,所以有找看看有無其他用.Net寫的class可以拿來利用。看了看,想想還是呼叫cmd 下的FTP算了… 一旦確定要用cmd呼叫FTP,就開始去做。這點不困難,在原本官方的user guide這文件中就有範例,但實際運作時,卻發現一個重大的問題! 因為在powershell所呼叫的ftp,由於是產生一個cmd的process去執行,所以,程式並不會等這ftp跑完,反而繼續我程式中後續的動作。偏偏我後面的動作會把ftp抓回來的資料搬一到其他地方去作為log之用!結果,就是powershell跑完了,但ftp卻『尚未』把資料抓回來。也就是說,powershell的程式,認為沒資料(因為ftp還沒把資料抓回來),所以就結束運作! :( 這點非常嚴重,找了不少資料,終於在MS的相關網站上找到解決之道…終於可以先確認ftp這段執行完畢後,原程序再繼續執行!下面就是處理方式~ PS: 但是在我測試時,我還是遇到一個詭異的問題(有遇過幾次,但不常見)。因為我在程式一開始運作,會先產生一個暫存的子目錄,等到最後,把該目錄內的資料搬移(Move-item )到LOG的目錄內,最後再把該暫存子目錄砍掉(Remove-Item)。這樣的流程,並無問題,但…就是發生,檔案還沒移走,但後面的砍掉子目錄動作卻已經做了。造成我的log資料不完整。這樣的狀況,就很難理解 function getFtpFile{ $todayfile= $args[0] $todayfile_m= $args[1] $ftphost= "127.0.0.1" $ftpuser= 'user' $ftppass= 'password' Set-Content -path ftp.txt $ftpuser Add-Content -path ftp.txt $ftppass Add-Content -path f...

powershell

圖片
最近再看一篇sql server的管理文章時,注意到他是用一種沒見過的shell - powershell 來設定、管理sql 2005,仔細看後,發覺M$終於想通了,給了一個比較像樣的shell。不然很多工作(如一些批次處理),在以往我可能都採用AP或網頁的方式去處理 !但,每次看到同事們在unix-like的系統下,卻都有好用的shell script,總是挺羨慕的 所以就去下載、安裝來試試看…初步感覺還不錯,應該可以來拿替代原本一些批次處理的程式 附註: power shell下載點 參考文件一 (user guide這份一定要好好看一下,因為該文件中會和unix下的shell做些小比較、說明。蠻詳細的在介紹power shell的一些基礎觀念和作法) 參考文件二 (撰寫時必備的參考文件)