18:50 2023/10/13 (金) start
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.
▲ トップへ戻る