前のパートでは、PowerShellの実行方法を学び、スクリプト実行ポリシーを見つけました。 コマンドレットが何であるかを理解し、パイプラインに沿ってコマンドレットを転送する方法と、プロパティを取得する方法を知っています。 PowerShellには大きな助けがあることがわかりました。
このパートでは、変数を扱い、変数のタイプとそのアクセス方法、可能な限りあらゆる方法で比較および表示する方法を調べます。 サイクルに対処し、いくつかの関数を作成してください。
←パートIに移動
はじめに
最初のジャンプスタートで発生した質問に答えることから始めます。
PowerShellの優れた機能は何ですか? なぜ勉強する必要があるのですか?
「絶好の機会」という言葉の下にいる誰もが自分のことを理解できます。
PowerShellを3語で説明しなければならなかった場合、これは管理を簡素化し、 自動化と管理のためのツールの作成を支援する環境です。
Windows ServerおよびMicrosoftサーバーソフトウェアを管理している場合は、PowerShellを検討する価値があります。 たとえば、最も人気のあるMicrosoft Exchange Server製品の1つを取り上げると、電源管理シェルExchange管理シェルコンソールが表示されます。
PoShを知っていると、必要なデータのアップロード、システムプロセスの制御の構成、レポートの送信、ユーザーの作成、問題の解決を簡単に行うことができます...
PowerShellを3語で説明しなければならなかった場合、これは管理を簡素化し、 自動化と管理のためのツールの作成を支援する環境です。
Windows ServerおよびMicrosoftサーバーソフトウェアを管理している場合は、PowerShellを検討する価値があります。 たとえば、最も人気のあるMicrosoft Exchange Server製品の1つを取り上げると、電源管理シェルExchange管理シェルコンソールが表示されます。
PoShを知っていると、必要なデータのアップロード、システムプロセスの制御の構成、レポートの送信、ユーザーの作成、問題の解決を簡単に行うことができます...
私は管理しません
MVAでビデオを見ることができます!
はい、私はあなたに完全に同意します-より効果的です。
確かに、だれもが12〜15時間のコースを見る時間があるわけではなく、誰もがこの方法で情報を把握できるわけではありません。
ここで、私は自分のスキルを無限にさらに発展させ続けることに成功するための基本的な知識を与えようとします。
確かに、だれもが12〜15時間のコースを見る時間があるわけではなく、誰もがこの方法で情報を把握できるわけではありません。
ここで、私は自分のスキルを無限にさらに発展させ続けることに成功するための基本的な知識を与えようとします。
変数
- PowerShellの変数は、 $記号
(欧州連合では€記号)で始まり、名前に任意の文字、数字、アンダースコアを含めることができます。 - 変数に値を割り当てるには、「 = 」記号を使用して値を割り当てます。 変数の値を表示するには、単にこの変数を書くことができます。 以下のテキストの情報の出力を分析します。
$var = 619 $var
- 算術演算は数値に対して実行でき、行を追加できます。 文字列に数値を追加すると、数値は自動的に文字列に変換されます。
$a = 1 $b = 2 $c = $a + $b $c #c = 3 $str = "" $str = $str + "" $str #str = $str = $str + 2014 $str #str = 2014
- この変数またはその変数の型を調べる必要がある場合は、GetType()メソッドを使用できます
$s = " ?" $s.GetType().FullName
- PowerShellの変数のタイプは自動的に決定されるか、手動で割り当てることができます。
$var = "one" [string]$var = "one"
PowerShellは、Microsoft .NET Frameworkデータ型を使用します。 主なものを検討してください。
タイプ/ .NETクラス 説明 [文字列]
System.stringひも
$var = "one"
[char]
System.char記号
$var = [char]0x263b
[bool]
System.Booleanブール。 $ trueまたは$ falseにできます。
$bvar = $true
[int]
System.Int3232ビット整数
$i = 123456789
[長い]
System.Int6464ビット整数
$long_var = 12345678910
[10進数]
System.Decimal128ビットの10進数。 数字の最後にある文字dが必要です
$dec_var = 12345.6789d
[ダブル]
System.Double8バイトの10進浮動小数点数
[double]$double_var = 12345.6789
[シングル]
System.Single32ビット浮動小数点数
[single]$var = 123456789.101112
[日時]
System.DateTime可変日時。
$dt_var = Get-Date
[配列]
System.Object []配列 配列の要素のインデックスは0で始まります-配列の最初の要素$ masを参照するには、 $ mas [0]を書き込みます。
$mas = "one", "two", "three";
配列に要素を追加するには、次のように記述できます
$mas = $mas + "four"
配列の各要素は、独自のタイプを持つことができます。
$mas[4] = 1
[ハッシュテーブル]
System.Collections.Hashtableハッシュテーブル。 ハッシュテーブルと配列の違いは、インデックスが配列で使用され、名前付きキーがハッシュテーブルで使用されることです。 ハッシュテーブルは次の原則に基づいて構築されます : @ {key = "value"}
$ht = @{odin="one"; dva="two"; tri="three"}
ハッシュテーブルにアイテムを追加するには、まだ存在しないキーを割り当てるか、 Add()メソッドを使用します。 既存のキーに割り当てが行われると、キー値は割り当てられたキーに変更されます。 ハッシュテーブルからアイテムを削除するには、 Remove()メソッドがあります。
$ht.Add("chetyre", "four") $ht.pyat = "five" $ht.Remove("dva")
おそらく、変数には特定の値だけでなく、テーブル内のSystem.Object []クラスに注目できることを既に理解しているでしょう。 また、コマンドレットの出力を変数に書き込むこともできます。
戦闘タスクを分析しましょう 。ネットワーク上の複数のコンピューターのIPアドレスとMACアドレスを見つける必要があります。 コンピューター名domain-comp1、domain-comp2。 ネタバレの下でのソリューション:
コードを表示
Get-WmiObjectコマンドレットの結果を$ MAC変数に書き込みます。これを使用して、WMI要求を-computernameパラメーターで指定されたコンピューターに送信し、 Win32_NetworkAdapterConfigurationクラスから必要な情報を返します。
現在のコンピューターのIPアドレスとMACアドレスを取得する必要がある場合、コンピューター名の代わりに、-computernameパラメーターにドットを渡すことに注意してください。 そして、次の例では、結果をファイルDに保存します。\ comp_mac_ip.csv:
$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つの値の等価性または対応を検証します。
- 条件が満たされると、比較構造は常にブール値$ trueまたは条件がfalseの場合は$ falseを返します。
以下の表に比較演算子を示します。
オペレーター | 説明 | 例 |
---|---|---|
-eq | 等しい(=) |
|
-ne | 等しくない(<>) | |
-gt | より大きい/もっと(>) | |
-ge | より大きいか等しい/より大きいか等しい(> =) | |
-lt | より小さい(<) | |
-le | より小さいか等しい(<=) | |
のような | ワイルドカードとの比較 | |
-気に入らない | ワイルドカードの不一致の比較 | |
含む | 左側の値に右側の値が含まれていますか | |
-含まない | 左側の値に右側の値が含まれていない場合、真実が得られます | |
-マッチ | 正規表現を使用してパターンを一致させる | |
-不一致 | 正規表現を使用してパターンの不一致を見つける | |
-交換 | 演算子の左側の値の一部またはすべてを置き換えます | |
例を見てみましょう。 この例では、オペレーティングシステムに応じて、リモートコンピューター上の可能なユーザープロファイルへのパスを形成します。 ネタバレの下でのソリューション:
コードを表示
はい、ここではプロファイルが存在するかどうかを確認しません。 しかし、確認できます。 これを行うには、 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" # $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での彼の正規表現を非常によく説明しています。 正規表現を書く能力を読んで理解するのに数時間費やす価値があります。
- 比較で大文字と小文字が区別される場合、オプションで条件を指定できます。 これを行うには、演算子の前に文字「 c 」を代入します
$str1 = "Habr" $str2 = "habr" $str1 -ceq $str2 #$false
- 論理演算子を使用して複数の比較演算子を使用できます。 論理演算子は次の表にリストされています。
オペレーター | 説明 | 例 |
---|---|---|
-そして | 論理的 | |
-または | 論理的または | |
-ではない | 論理的ではない | または
|
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 }
答え
情報出力
画面に情報を表示するためのいくつかの基本的なオプションを検討してください。
- Out-Fileを使用したファイルへの書き込み
$str = "Hello Habr!" $str | Out-File D:\out_test1.txt
または、パートIで説明したように、「 > 」記号を使用します
$str = "Hello Habr!" $str > D:\out_test2.txt
- Export -Csvを使用してデータを.csvファイルにエクスポートします
$p = Get-Process $p | SELECT Name, Path | Export-Csv -Path D:\out_test3.csv
- ConvertTo-Htmlを使用してHTMLファイルに書き込む
$h = Get-Process $h | ConvertTo-Html -Property Name, Path > D:\out_test4.html & D:\out_test4.html #
HTML出力の操作は、実際には非常に便利です。 Webプログラミングのスキルがあれば、スタイルを追加して、最後に非常に優れたレポートを取得できます。
使い慣れた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の関数の構造は次のとおりです。
function - ([1, ..., N]) { - }
- 関数は結果を返す必要はありません。
- 関数を呼び出すとき、すべてのパラメーターはスペースで区切られます。
たとえば、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を学びます。
継続するには...
追加情報
- PowerShellのジャンプスタート(パートI) ;
- 登録せずにPowerShell v.5を無料でダウンロードしてください 。
- 優れたMVAコース: PowerShell 3.0の高度な機能とスクリプト(ジャンプスタート) 。 私のアドバイスは、最初の3つのブロックを見て、言語に飛び込み、いくつかのタスクを実行し、1週間後に残りのブロックを調べることです。 ロシア語の字幕。
- TechDaysテーマビデオ。
TechnetのPowerShellスクリプトギャラリー 。
PowerShell開発者ブログ