18:50 2023/10/13 (金) start

PowerShell

Windows PowerShellの学習を始める。参考文献:Windows PowerShell 著者 Lee Holmes 発行所 (株)オライリー・ジャパンを購入。これについては超超初心者であるから、本書だけではなく、ググり回して 備忘録を追記してゆく。

2023/11/10 (金)
関数定義
Function 関数名 [ (引数1, 引数2, ...) ]    # [ ]は省略可能
{
    スクリプトブロック
 rerutn 戻り値
}

または

Function 関数名 (  )
{
    param(引数1, 引数2, ...)
    スクリプトブロック
    return 戻り値
}

# コンソール内での使用例
PS> Function Operation ($a, $b)
>> {
          return [Math]::Log($a,$b)     # Log(真数, 底)
>> }
PS> operation 100 10 
2  #計算結果 

PS> Function Cal ( )
>> {
          param ($a, $b)
     return [Math]::Log($a, $b)
>> }
PS> cal 100 10
2

# 関数使用例 
# 任意の1以上の数字(小数でもOK. ただし整数値評価)を入力.3の倍数あるいは数の中に3があれば
# 数表示を!で表示かつ色を変える.
# スクリプトで用いるなら先に関数定義を行う.
# ファイル名を保存.ルールに則りコンソールでのファイル名指定で実行.

Function Ope() # まずは関数定義 
{
    param($value, $active)
    If ($active) # $acticeが真のときを意味.
    { Write-Host "$value !" -ForegroundColor Red   # 文字色 赤 システム不対応の色あり
    }
    Else
    {
      Write-Host "$value" -ForegroundColor Blue    # 文字色 青
    }
}

Function Finish() # 終了実行 End() , Fin()でもOK. ただし、スクリプトブロックでは同じ名前.
{
    Write-Host "終了" -ForegroundColor Green       # 文字色 緑
}

# ここからスクリプト
Write-Host "3の倍数と3の付く数字のときは ! で区別します。 "
[int32]$MaxCount = Read-Host "1以上の数える数を入力して下さい。" 
For ($count=1; $count -lt $MaxCount + 1; $count++) # 数字0では終了のみ.
{
    If ((($count % 3) / 3 -eq 0) -or ($count -match "3"))
    {
        Ope $count $TRUE   # 関数名 引数1 引数2 $value仮変数、$count実変数とみれば良い.
    }                      
    Else
    {
        Ope $count $FALSE  
    }
Start-Sleep 1
}
Finish

# 実行出力(コンソール内)
# ******.ps1と保存. このファイルはシェル開始時のパスと同じ階層に存在.
# PS > .\******.ps1としてEnterキーを押下して実行.

3の倍数と3の付く数字のときは ! で区別します。
任意の数える数を入力して下さい。: 5
1
2
3 !
4
5
終了

# Switch構文
PS > $category = "Q"
PS > Switch ($category) {
>> "Z" { Write-Host "整数" }
>> "N" { Write-Host "自然数" }
>> "Q" { Write-Host "有理数" }
>> "C" { Write-Host "複素数" }
>> default { Write-Host "実数" }
>> }
有理数

# 複数の分岐条件で有用 ここではコンソールでやっているが、Read-Hostを用いて入力したオブジェクト
# を評価とする値にして分岐するのが一般的. PS1ファイルからの実行となるだろう.

PowerShellではプロファイルの作成を行っておく。プロファイルを作成後、最初の起動でsystemパスの
起動であろうから、起動後のコンソールに$Profileを入力実行して、プロファイルの場所を見つける。
恐らくはユーザーのDocumentsディレクトリにある。そのパスで.txtファイルを開き、
Set-Location C:\Users\ユーザー名を入力・保存する。
Powershellを再度開くと、パスがC:\Users\ユーザー名での起動となる。
実態は.txtだが、ファイル名が.ps1となっているように、PowerShellが起動時に
そのファイルを読み込むからである。

当該ファイルや実行可能なコマンドをシステムパスで実行するには、そのファイル名を入力.
Program.exe arguments
TurtleProject.ps1 arguments

名前にスペースがあるときは
'Program Private.exe' arguments
'Turtle Project.ps1' arguments

実行には&(アンパサンド)をコマンドの前に置く.
& Program.exe arguments
& 'Program Private.exe' arguments
& TurtleProject.ps1 arguments
& 'Turtle Project.ps1' arguments

カレントディレクトリからの実行には .\をファイルの直前におく.
.\Program.exe arguments

名前にスペースが含まれるコマンドをカレントディレクトリから実行するには
& '.\Turtle Project.ps1' arguments

|(パイプライン記号)

左のオブジェクトを右のオブジェクトへと橋渡しするもの
例えば、Alias(エイリアス)と呼ばれる入手したAlias情報をパイプラインでテキストへ保存してみる.
オブジェクトに用いられる略称.これは自分用に作成可能.


PS > Get-Alias | Out-File C:\Users\ユーザー名\フォルダー名\Alias.txt  -append
PS >

保存されたAlias.txtの内容の一部分

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           ? -> Where-Object                                             
Alias           % -> ForEach-Object                                           
Alias           ac -> Add-Content                                             
Alias           cat -> Get-Content                                            
Alias           cd -> Set-Location                                            
Alias           chdir -> Set-Location                                         
Alias           clc -> Clear-Content                                          
Alias           clear -> Clear-Host                                           
Alias           clhy -> Clear-History                                         
Alias           cli -> Clear-Item                                             

Get-Alias, Add-Contentのように、通常、「動詞」+「名詞」形式のコマンドをコマンドレットと呼ぶ.
このコマンドレットを一々入力せずとも、Aliasで代用できるという。
また、実際にPowerShellに入力する際、あるコマンドレットを入れると、Tabキーや→キーで候補が出てくる。
Get-Aliasのエイリアスはgalであるから、上述のコードは

PS > gal | Out-File C:\Users\ユーザー名\フォルダー名\Alias.txt  -append
PS >
にしても同様の結果となる.

if文 : 条件分岐

PS >  param($num = 4)
PS > if ($num -gt 0) {
>> '正の数です'
>> } elseif($num -eq 0) {
>> 'ゼロです'
>> } else {
>> '負の数です'
>> }
正の数です
PS > param($num = 0)
PS > if ($num -gt 0) {        # A -gt B は A > B  
>> '正の数です'
>> } elseif($num -eq 0) {     # A -eq B は  A = B
>> 'ゼロです'
>> } else {
>> '負の数です'
>> }
ゼロです

"パイプライン"
#現在のプロセスごとの仮想メモリ量を取得して、降順に並べ変える.
PS > gps | Select-Object Name, VM | Sort-Object VM -Descending

# 出力結果 - 一部 -
Name                                                VM
----                                                --
msedgewebview2                           3513483579392
msedge                                   3513408458752
msedge                                   3513322397696
msedge                                   3513267007488

"プロパティの取得"
PS > Get-ChildItem | Get-Member -MemberType property

# 実行結果
TypeName: System.IO.DirectoryInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
Exists            Property   bool Exists {get;}
Extension         Property   string Extension {get;}
FullName          Property   string FullName {get;}
---------------------------------------------------------------------------
TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
Directory         Property   System.IO.DirectoryInfo Directory {get;}
DirectoryName     Property   string DirectoryName {get;}
Exists            Property   bool Exists {get;}
Extension         Property   string Extension {get;}
FullName          Property   string FullName {get;}
IsReadOnly        Property   bool IsReadOnly {get;set;}
LastAccessTime    Property   datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   datetime LastWriteTime {get;set;}

の情報が得られる。ここで、このプロパティの情報から、先述のAlias.txtのCreationTimeを求める。
PS > (Get-ChildItem ***\***\Alias.txt).CreationTime
2023年10月15日 15:29:51

"リダイレクション演算子"
Get-ChildItem > files.txt     ※ Out-File
Get-ChildItem >> files.txt    ※ Out-File 追記

"シェルセッションのログまたはトランスクリプトの記録"
Start-TranScript Path Pathは省略可能
Stop-TranScript 記録終了
 
"日付の計算"
2028年の夏至まであと何日あるかを計算.
PS > $left_days = [DateTime]"2028/6/21" - [DateTime]::Now
PS > $left_days.TotalDays
1700.23354594428  # [DateTime]は日付変換を示す.ならば整数値変換は[int]では?
PS > [int]$left_days.TotalDays
1700         # 2028年の夏至まで凡そ1700日である.

"実行中のプロセス数を調べる"
PS > $handleCount = 0
PS > foreach($process in Get-Process) { $handleCount += $process.Handles }
PS > $handleCount
94302

"ユーザー定義変数" # オーバーライドされない変数定義
PS > Set-Variable -Name pi -Value 3.14 -Option Constant
PS > $pi
3.14
PS > $pi = 3
WriteError : Cannot overwrite variable pi becuase it is read-only or costant.


▲ トップへ戻る


戻る
カテゴリー