PowerShellのジャンプスタート(パートII)

そうでない場合は誰ですか? いつですか?







前のパートでは、PowerShellの実行方法を学び、スクリプト実行ポリシーを見つけました。 コマンドレットが何であるかを理解し、パイプラインに沿ってコマンドレットを転送する方法と、プロパティを取得する方法を知っています。 PowerShellには大きな助けがあることがわかりました。



このパートでは、変数を扱い、変数のタイプとそのアクセス方法、可能な限りあらゆる方法で比較および表示する方法を調べます。 サイクルに対処し、いくつかの関数を作成してください。



←パートIに移動



はじめに





最初のジャンプスタートで発生した質問に答えることから始めます。



PowerShellの優れた機能は何ですか? なぜ勉強する必要があるのですか?
「絶好の機会」という言葉の下にいる誰もが自分のことを理解できます。

PowerShellを3語で説明しなければならなかった場合、これは管理を簡素化し、 自動化管理のためのツールの作成を支援する環境です。



Windows ServerおよびMicrosoftサーバーソフトウェアを管理している場合は、PowerShellを検討する価値があります。 たとえば、最も人気のあるMicrosoft Exchange Server製品の1つを取り上げると、電源管理シェルExchange管理シェルコンソールが表示されます。

PoShを知っていると、必要なデータのアップロード、システムプロセスの制御の構成、レポートの送信、ユーザーの作成、問題の解決を簡単に行うことができます...



私は管理しません
これは、まったく異なる職業の人々がWebサイトの作成に夢中になっている方法と比較できます。 彼らは本当にそれを必要としないようですが、彼らはそれをやっています。 独自の開発、エンターテイメント、または喜びのために。

あなたは学生ですか? 二次方程式を解く最初のアプリケーションを作成してください。

または、たとえば、解析を勉強して、YouTubeから音楽や美しいビデオをダウンロードするための独自のアプリケーションを作成します。

それはすべてあなたとあなたの想像力にかかっています。 こちらをご覧ください。PowerShell 話すことも教えられます。



MVAでビデオを見ることができます!
はい、私はあなたに完全に同意します-より効果的です。

確かに、だれもが12〜15時間のコースを見る時間があるわけではなく、誰もがこの方法で情報を把握できるわけではありません。

ここで、私は自分のスキルを無限にさらに発展させ続けることに成功するための基本的な知識を与えようとします。





変数









おそらく、変数には特定の値だけでなく、テーブル内のSystem.Object []クラスに注目できることを既に理解しているでしょう。 また、コマンドレットの出力を変数に書き込むこともできます。



戦闘タスクを分析しましょう 。ネットワーク上複数のコンピューターのIPアドレスMACアドレスを見つける必要があります。 コンピューター名domain-comp1、domain-comp2。 ネタバレの下でのソリューション:

コードを表示


 $MAC = Get-WmiObject -ComputerName domain-comp1, domain-comp2 -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=True | Select-Object -Property * | SELECT PSComputerName, @{Name="IPAddress";Expression={$_.IPAddress.get(0)}}, MACAddress, Description $MAC
      
      





何が起こっている:


Get-WmiObjectコマンドレットの結果を$ MAC変数に書き込みます。これを使用して、WMI要求を-computernameパラメーターで指定されたコンピューターに送信し、 Win32_NetworkAdapterConfigurationクラスから必要な情報を返します。

現在のコンピューターのIPアドレスとMACアドレスを取得する必要がある場合、コンピューター名の代わりに、-computernameパラメーターにドットを渡すことに注意してください。 そして、次の例では、結果をファイルDに保存します。\ comp_mac_ip.csv:

 $MAC = Get-WmiObject -ComputerName . -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=True | Select-Object -Property * | SELECT PSComputerName, @{Name="IPAddress";Expression={$_.IPAddress.get(0)}}, MACAddress, Description $MAC | Export-Csv D:comp_ip_mac.csv -Encoding UTF8
      
      











可変範囲




PowerShellの変数のスコープは、 ローカルまたはグローバルのいずれかです。 デフォルトでは、変数はローカルスコープを持ち、スコープに制限されています。たとえば、関数または現在のスクリプトでのみ使用できます。 グローバル変数は、現在のPowerShellセッション全体で有効です。 グローバル変数を指定するには、次の構成を記述するだけで十分です。 $ Global:variable = value



 $Global:var = 12
      
      







そして、変数のトピックに関する別のトリック...どういうわけか、同僚1Cとそのロシア語プログラミング環境と議論して、彼らは尋ねました:

-おもしろいです。PowerShellでロシア語の関数または変数を設定すると、機能しますか?
-理論的には、動作するはずです。これらもシンボルです。



はい、確かに:



 function () { ", $env:USERNAME.      ?" Start-Sleep 3 " ?" } function () { & "C:\Program Files\Internet Explorer\iexplore.exe" http://habrahabr.ru/post/242425/ }
      
      

















比較演算子と論理演算子





比較演算子と論理演算子は、2つの値の等価性または対応を検証します。







以下の表に比較演算子を示します。



オペレーター 説明
-eq 等しい(=)
 $var = "619" $var -eq 123 #$false
      
      





-ne 等しくない(<>)
 $var = "619" $var -ne 123 #$true
      
      



-gt より大きい/もっと(>)
 $var = "619" $var -gt 123 #$true
      
      



-ge より大きいか等しい/より大きいか等しい(> =)
 $var = "619" $var -ge 123 #$true
      
      



-lt より小さい(<)
 $var = "619" $var -lt 123 #$false
      
      



-le より小さいか等しい(<=)
 $var = "619" $var -le 123 #$false
      
      



のような ワイルドカードとの比較
 "Habra" -like "habr*" #true
      
      



-気に入らない ワイルドカードの不一致の比較
 "Habra" -notlike "habr*" #false
      
      



含む 左側の値に右側の値が含まれていますか
 1, 2, 3, 4, 5 -contains 3 #$true
      
      



-含まない 左側の値に右側の値が含まれていない場合、真実が得られます
 1, 2, 3, 4, 5 -notcontains 3 #$false
      
      



-マッチ 正規表現を使用してパターンを一致させる
 $str = "http://habrahabr.ru" $str -match "^http://(\S+)+(.ru)$" #$true
      
      



-不一致 正規表現を使用してパターンの不一致を見つける
 $str = "http://habrahabr.ru" $str -notmatch "^http://(\S+)+(.com)$" #true
      
      



-交換 演算子の左側の値の一部またはすべてを置き換えます
 "Microhabr" -replace "Micro","Habra" #Habrahabr
      
      







例を見てみましょう。 この例では、オペレーティングシステムに応じて、リモートコンピューター上の可能なユーザープロファイルへのパスを形成します。 ネタバレの下でのソリューション:

コードを表示


 #      Function UProfile ($UCompName, $ULogin) { [string]$CompOS = Get-WmiObject -ComputerName $UCompName -Class Win32_OperatingSystem | SELECT Caption #     if ($CompOS -match "Windows 7") { #    "Windows 7" [string]$LinkUserProfile = "\\$UCompName\d$\users\$ULogin" #   $LinkUserProfile } elseif ($CompOS -match "Windows XP") { #    "Windows XP" [string]$LinkUserProfile = "\\$UCompName\d$\Documents and Settings\$ULogin" #   $LinkUserProfile } } UProfile domain-comp1 Administrator # - -
      
      







はい、ここではプロファイルが存在するかどうかを確認しません。 しかし、確認できます。 これを行うには、 Test-Pathコマンドレットでパスの存在を確認する別の条件を追加します。



 #      Function UProfile ($UCompName, $ULogin) { [string]$CompOS = Get-WmiObject -ComputerName $UCompName -Class Win32_OperatingSystem | SELECT Caption #     if ($CompOS -match "Windows 7") { #    "Windows 7" [string]$LinkUserProfile = "\\$UCompName\d$\users\$ULogin" #   } elseif ($CompOS -match "Windows XP") { #    "Windows XP" [string]$LinkUserProfile = "\\$UCompName\d$\Documents and Settings\$ULogin" #   } if (Test-Path $LinkUserProfile) { $LinkUserProfile } else { " $ULogin     $UCompName" } #   } UProfile domain-comp1 Administrator # - -
      
      









ところで、 Xaegrは彼のブログ でPowerShellでの彼の正規表現を非常によく説明してます。 正規表現を書く能力を読んで理解するのに数時間費やす価値があります。







オペレーター 説明
-そして 論理的
 ("" -eq "") -and (619 -eq 619) #$true
      
      



-または 論理的または
 ("" -eq "") -or (619 -eq 123) #$true
      
      



-ではない 論理的ではない
 -not (123 -gt 324) #$true
      
      



または

 !(123 -gt 324) #$true
      
      







if ... elseifおよびelseについて一言


 if ( 1- ) { - } #  1 ,  ,   -   elseif ( 2- ) { - } # : ,   2 ,   else { - } # :     ,  
      
      







すべてが非常に簡単です。 条件が真の場合、中括弧で囲まれた条件に続くコードを実行します。 条件が真でない場合、実行をスキップし、条件がさらに続くかどうかを確認します。

elseifが見つかった場合は、新しい条件を確認し、成功した場合はコードを実行します。それ以外の場合は、elseifまたはelseの形式で継続があるかどうかを再度調べます。

条件が満たされると、コードが実行され、elseifまたはelseブランチがスキップされます。



 $str = "" if ( 1 -gt 2 ) { $str = "" } elseif ( $str -eq "" ) { $str } else { $str = ""; $str }
      
      





答え






情報出力





画面に情報を表示するためのいくつかの基本的なオプションを検討してください。





使い慣れたGet-Contentコマンドレットは、ファイルの読み取りに役立ちます。



 Get-Content D:\out_test1.txt
      
      











サイクル



PowerShellループは、他の言語のループと大差ありません。 他の場所とほぼ同じ:



しながらする


条件が真である限り行う



 $x = 10 do { $x $x = $x - 1 } while ($x -gt 0)
      
      







までする


条件が満たされている間に一連のコマンドを繰り返すループ



 $x = 0 do { $x $x = $x + 1 } until ($x -gt 10)
      
      







のために


同じステップを特定の回数繰り返すサイクル



 for ($i = 0; $i -lt 10; $i++) { $i }
      
      







Foreach


オブジェクト収集サイクル



 $collection = "-1", "-2", "-3" foreach ($item in $collection) { $item }
      
      







関数を書く









たとえば、PowerShellで数値の2乗を取得する関数は次のようになります。



 function sqr ($a) { return $a * $a } sqr 2 #: 4
      
      







そして最後に、音訳を実行するのに役立つ関数の例です。 この例では、今日検討したすべてのものだけです:

コードを表示


 # function Translit ([string]$inString) { $Translit = @{ # -   [char]'' = "a" [char]'' = "A" [char]'' = "b" [char]'' = "B" [char]'' = "v" [char]'' = "V" [char]'' = "g" [char]'' = "G" [char]'' = "d" [char]'' = "D" [char]'' = "e" [char]'' = "E" [char]'' = "yo" [char]'' = "Yo" [char]'' = "zh" [char]'' = "Zh" [char]'' = "z" [char]'' = "Z" [char]'' = "i" [char]'' = "I" [char]'' = "j" [char]'' = "J" [char]'' = "k" [char]'' = "K" [char]'' = "l" [char]'' = "L" [char]'' = "m" [char]'' = "M" [char]'' = "n" [char]'' = "N" [char]'' = "o" [char]'' = "O" [char]'' = "p" [char]'' = "P" [char]'' = "r" [char]'' = "R" [char]'' = "s" [char]'' = "S" [char]'' = "t" [char]'' = "T" [char]'' = "u" [char]'' = "U" [char]'' = "f" [char]'' = "F" [char]'' = "h" [char]'' = "H" [char]'' = "c" [char]'' = "C" [char]'' = "ch" [char]'' = "Ch" [char]'' = "sh" [char]'' = "Sh" [char]'' = "sch" [char]'' = "Sch" [char]'' = "" [char]'' = "" [char]'' = "y" [char]'' = "Y" [char]'' = "" [char]'' = "" [char]'' = "e" [char]'' = "E" [char]'' = "yu" [char]'' = "Yu" [char]'' = "ya" [char]'' = "Ya" } $TranslitText = "" foreach ($CHR in $inCHR = $inString.ToCharArray()) { if ($Translit[$CHR] -cne $Null) { $TranslitText += $Translit[$CHR] } #  $TranslitText = $TranslitText + $Translit[$CHR] else { $TranslitText += $CHR } } return $TranslitText } Translit  #: Habrahabr
      
      









あとがき





これで、PowerShellをさらに深く掘り下げるのに十分な情報がわかりました。 このパートでは、変数、データ型、情報の出力の整理、比較演算子、ループに会いました...見てください、開始はそれほど難しくないことがわかりました!



平静を保ち、PowerShellを学びます。



継続するには...





追加情報








All Articles