指定フォルダ(現在のフォルダ)内のフォルダ、ファイルから、読み取り専用を判定し取得したい。
目次
説明
まずは、Get-ChildItemコマンドレットでフォルダ内の情報を取得してみる。
Get-ChildItem -Path . -Recurceパスを指定。
 相対パス:現在のフォルダー ピリオド( . )
      現在のフォルダの親フォルダ 二重ピリオド( .. )
すべての子コンテナ内の項目も取得する。
 Recurceパラメータ
実行結果。
    ディレクトリ: C:\Users\0905s\MY_WORK\PowerShell\SAMPLE01
Mode                 LastWriteTime         Length Name                                                          
----                 -------------         ------ ----                                                          
d-----        2024/07/13     17:23                FOLDER_01                                                     
d-----        2024/07/13     17:22                FOLDER_02                                                     
    ディレクトリ: C:\Users\0905s\MY_WORK\PowerShell\SAMPLE01\FOLDER_01
Mode                 LastWriteTime         Length Name                                                          
----                 -------------         ------ ----                                                          
-a----        2024/07/13     17:21              0 FILE_01.txt                                                   
-a----        2024/07/13     17:23              0 FILE_02.txt                                                   
    ディレクトリ: C:\Users\0905s\MY_WORK\PowerShell\SAMPLE01\FOLDER_02
Mode                 LastWriteTime         Length Name                                                          
----                 -------------         ------ ----                                                          
d-----        2024/07/13     17:22                FOLDER_03                                                     
-a----        2024/07/13     17:21              0 FILE_02.txt                                                   
    ディレクトリ: C:\Users\0905s\MY_WORK\PowerShell\SAMPLE01\FOLDER_02\FOLDER_03
Mode                 LastWriteTime         Length Name                                                          
----                 -------------         ------ ----                                                          
-ar---        2024/07/13     17:22              0 FILE_02.txt                                                   
-a----        2024/07/13     17:22              0 FILE_03.txt    Modeについて。
スクロールできます 
| Mode | 意味 | 
|---|---|
| d | ディレクトリ(フォルダ) | 
| a | アーカイブ(ファイル) | 
| r | 読み取り専用 | 
| h | 隠しファイル | 
| s | システムファイル | 
読み取り専用( r )だけを取得。
Get-ChildItem -Path . -Recurse | %{ If( $_.IsReadOnly) { $_.Name }実行結果。
FILE_02.txtフルパスで取得する場合。
Get-ChildItem -Path . -Recurse | %{ If( $_.IsReadOnly) { $_.FullName }実行結果。
C:\Users\0905s\MY_WORK\PowerShell\SAMPLE01\FOLDER_02\FOLDER_03\FILE_02.txt| (パイプライン):
 結果を次の処理に渡すための機能。PowerShellのパイプラインはデータがオブジェクト型で渡されるのが特徴。
% :
 ForEach-Objectコマンドレットのエイリアス。
$_. (ドルアンダースコアどっと):
 パイプラインを通じて取得したオブジェクトを参照するためのシェル変数。
パイプラインを通じて取得したオブジェクト型のデータを1件ずつ読み取り専用を判定し、Trueならファイル名を取得している。
PowerShellの2種類のForeach
- ForEach-ObjectコマンドレットのエイリアスとしてのForEach
- ForEach-Objectのエイリアスには、%、foreachという名前がある。
 
 - ForEachステートメント
- 配列に格納されている値やオブジェクトを一つずつ処理するときに使用。
 
 
使用の判断はとりあえずパイプラインを使用するかどうか。(内部での処理がことなる)
 ※ステートメントのほうは、パイプでオブジェクトの受け取りができないため。
普通のプログラム風にForEachステートメントで実装。
# フォルダ移動
Set-Location C:\Users\0905s\MY_WORK\PowerShell\SAMPLE01
# 変数に格納
$results = Get-ChildItem -Path . -Recurse 
# ForEachで取り出す
ForEach( $obj in $results)
{
    if( $obj.IsReadOnly)
    {
        $obj.Name
    }
}実行結果。
FILE_02.txt変数の型を見てみる。
# フォルダ移動
Set-Location C:\Users\0905s\MY_WORK\PowerShell\SAMPLE01
# 変数に格納
$results = Get-ChildItem -Path . -Recurse 
# ForEachで取り出す
ForEach( $obj in $results)
{
    if( $obj.IsReadOnly)
    {
        $obj.Name
    }
}
# Write-Host $results.GetType()
Write-Host $results.GetType().FullName
# Write-Host $obj.getType()
Write-Host $obj.getType().FullName実行結果。
FILE_02.txt
System.Object[]
System.IO.FileInfoPowerShellのSystem.Object[]は、規定でテーブルとして書式設定されたカスタムオブジェクトのコレクション。

コメント