私はさまざまな方法でこのスクリプトにたどり着き、効率的な Powershell スクリプトに関する多くのサイトを調べましたが、このスクリプトをより効率的にするためのヘルプを使用することはできます...CPU の 3 ~ 4% を使用します。プロセッサのメイン ドラッグは MainLogic 機能です。スクリプトの本体の開始時に While($true) ループにネストされ、常に実行されます... MainLogic 関数の特定のパラメーターが変更されると、関数が壊れ、特定の if then ステートメントが本体でテストされますスクリプト。私はより効率的なコードを書く方法を学ぼうとしています...私は Lisp 開発者になるために練習していて、Powershell の効率に関する良いレッスンは私たち全員にとって良いことだと思います。私はこのスクリプトを 3 回書き直しましたが、改善するための助けが必要です...ほとんどの Windows プロセスはほとんど CPU を使用せず、常に実行され、非常にスマートなコードです。私' そんなに上手になりたいです。スクリプトのすべてが必要です\スクリプトでテストされたものすべてをテストする必要があります。私は誰かが私を助けてくれるのを助けるためにたくさんコメントしました
私はこれらのことを試しました:
- この状況に適した構造を使用していますか? 私はこれに多くの方法で来ました...私はそうだと思いますが、より良い数学的アプローチがあるかもしれません....私はこれを助けるために線形代数を学んでいます。
- 操作が多すぎたり、不要な操作を行っていませんか? それが私の主な質問です....新しいアイデアの助けを借りることができます
- 処理しているオブジェクトが多すぎますか? 別の方法があるかどうかはわかりません..最小限のオブジェクトを使用したと思いますが、Getwmiobject は Get-Process よりも優れていますか? 等
- パイプラインは最良のアプローチですか? 私はうまくパイプラインしたと思う
- より適切に機能する別のコマンド モデルはありますか? Google で検索しましたが、Powershell に関連するコマンド モデルが見つかりません
- 対象について正しく考えていますか?Google で優れた PowerShell オブジェクトのレッスンを見つけることができないようですが、1 1\2 Powershell の本を読みましたが、私のようなコードはありませんでした。
- -Filter (使用可能な場合) を使用していますか? Get-Process では使用できません
- 不必要に変数を再初期化していませんか? 再初期化なし
- ループは効率的に設計されていますか? 私はそれらを最良の方法で設計したと思います-while($true)が別のwhile($true)内にネストされているため、ループごとにスクリプト全体を実行していません.... MainLogic関数(私のループ常に実行されます)
- for が同様に機能する場合、Foreach-Object を使用していますか? 適用できない
- 一度値を取得し、後で必要に応じて変数に保存しますか?...私はこれを行います
- オブジェクトに格納する代わりに、大規模なコレクションをパイプラインに渡していますか?...これを行っていません
- 不必要に条件をテストしていませんか? 私ですか?
これは単なる大きなスクリプトですか、それともコーディングに関する全体像が見えていないのでしょうか....より効率的なコードを書くのに役立つオンラインリソースを引用してください.私のロジックに穴が見られる場合.
これが私のスクリプトです。MainLogic Function はプロセッサを独り占めするものであり、調べる必要があるものはすべて....支援を支援するために残りを追加しました。前もって感謝します
#this function is ran by itself in a while($true) loop and is the main place in my script where information
about Firefox.Skype and VPN Processes is gathered.
function global:MainLogic()
{
#Monitor Skype WorkingSet for any changes - If change is detected the change it is processed under the
#"Skype Logic" Section to find out if a Skype call is in progress.
$SkypeProcess1 = get-process | where-object {$_.ProcessName -eq "skype"}
ss -s 1
$SkypeProcess2 = get-process | where-object {$_.ProcessName -eq "skype"}
$SkypeWsDiff = $SkypeProcess2.workingset - $SkypeProcess1.workingset
###Skype Logic###
#Test Skype Call Status and if changed break from this function in the ###SKype Break### sectiom below and
#check all parameters in body of script.
$y = $x
wo "`$x `= $x"
wo "`$y `= $y"
#Testing Information gathered in above section to see if Skype call in progress.
if($SkypeWsDiff -gt 8000000){$x = 1}
elseif($SkypeWsDiff -lt -11000000){$x = 2}
wo "Function2 `$x `= $x"
if ($x -eq 1){wo "Skype Telephone Call in Progress"
}
if ($x -eq 2){wo "Skype Telephone Call not in Progress"
}
wo "`$SkypeWsDiff `= $SkypeWsDiff"
###SKype Break###
if($y -ne $x){wo "Skype changed - break"
break}
wo "`$x `= $x"
wo "`$y `= $y"
#Skype Logic End
#Firefox Status gathered below and saved to variable $a is saved to variable $b here and stored to compare later
#with variable $a to see if Firefox Status changed.
$b = $a
wo "`$a `= $a"
wo "`$b `= $b"
#VPN Status gathered below and saved to variable $c is saved to variable $d here and stored to compare later
#with variable $c to see if VPN Status changed.
$d = $c
wo "`$c `= $c"
wo "`$d `= $d"
#Firefox and VPN status are saved here to variables for comparison later and above this section in the script.
if(ps firefox -ea 0){$a = 3 ; wo "Firefox is Open"
}
if(-not(ps firefox -ea 0)){$a = 4 ; wo "Firefox is Closed"
}
if(ipconfig | Select-String 'PPP adapter'){$c = 5 ; wo "VPN is Connected"
}
if((ipconfig | Select-String 'PPP adapter') -eq $null){$c = 6 ; wo "VPN is not connected"
}
#This is where the Firefox Variable comparison mentioned above actually happens. If change is detected the script
#breaks from this function and subsequently if\then logic is tested in body of script.
if($b -ne $a){wo "Firefox changed - break"
break}
wo "`$a `= $a"
wo "`$b `= $b"
#This is where the VPN Variable comparison mentioned above actually happens. If change is detected the script
#breaks from this function and subsequently if\then logic is tested in body of script.
if($d -ne $c){wo "VPN changed - break"
ss -s 2
break}
wo "`$c `= $c"
wo "`$d `= $d"
}
#Functions
#If Firefox is Open and VPN is Connected - Disconnect VPN
if ((ps firefox -ea 0) -and (ipconfig | Select-String 'PPP adapter')) {
rasdial "BTGuard VPN" /DISCONNECT
ss -s 5
}
#If Firefox is not Open and VPN is not Connected - Connect VPN
if ((-not(ps firefox -ea 0)) -and ((ipconfig | Select-String 'PPP adapter') -eq $null)) {
rasdial "BTGuard VPN" joe 11223344
}
while($true){
while($true){. MainLogic}
#If Skype call not in progress(variable $x) and Firefox is open and VPN is not connected - do nothing
if($x -eq 2 -and (ps firefox -ea 0) -and (ipconfig | Select-String 'PPP adapter') -eq $null)
{
}
#ElseIf Skype call not in progress(variable $x) and Firefox is not open and VPN is connected - do nothing
elseif($x -eq 2 -and (-not(ps firefox -ea 0)) -and (ipconfig | Select-String 'PPP adapter')){
}
#ElseIf Skype call not in progress(variable $x) and Firefox is open and VPN is connected - Disconnect VPN
elseif($x -eq 2 -and (ps firefox -ea 0) -and (ipconfig | Select-String 'PPP adapter')){
ss -s 1
rasdial "BTGuard VPN" /DISCONNECT
}
#ElseIf Skype call not in progress(variable $x) and Firefox is not open and VPN is not connected - Connect to VPN
elseif($x -eq 2 -and (-not(ps firefox -ea 0)) -and (ipconfig | Select-String 'PPP adapter') -eq $null){
rasdial "BTGuard VPN" joe 11223344
}
#ElseIf Skype call in progress(variable $x) - Do Nothing
elseif($x -eq 1){
}}