none
Power Shell _ Foreachの中で削除処理したファイルの件数をカウントする方法 RRS feed

  • 質問

  • 下記ではうまく取得できず困っています。

    よろしくお願いいたします。

     # 削除対象出力
        foreach($DeleteTarget IN $DeleteTarget)
        {
          # 削除処理
          $Delete = $DeleteTarget | Remove-Item -Recurse


          # ログ出力
          Write_Log $C_***_INFO $DeleteTarget 
        }


        # 削除処理の件数ログ
        $DeleteCount = ($Delete).Count
        Write_Log $C_***_ASIS ("削除件数 $DeleteCount 件") 

    2019年10月10日 9:11

回答

  • チャブーンです。

    この件、「やりたいこと」がタイトルにあった、ということなのですね。失礼しました。PowerShellですが、Get-ChildItemでオブジェクト化したものを、メソッド .delete()で削除すると、.exsistsプロパティで削除の有無を確認できます。これを使うと、うまくいくのではないでしょうか?

    $RootDir="<ルートフォルダーパス>"
    $DeletedItems=@()
    $DeleteTargets=Get-ChildItem $RootDir 
    
    Foreach ($DeleteTarget in $DeleteTargets) {
    	$DeleteTarget.delete()
    	$DeleteTarget.refresh()
    	$DeletedItems += $DeleteTarget.exists
    	Write-Host $DeleteTarget.fullname は現在 $DeleteTarget.exists です。
    }
    
    Write-Host 削除されたファイル数は ($DeletedItems|Where {$_ -eq $false}).count です。	


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2019年10月10日 11:46

すべての返信

  • Remove-Itemコマンドレットは戻り値なしのようです。

    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-item?view=powershell-6

    カウンターを0で初期化し、Remove-Itemコマンドレットで削除処理が行われた場合のみ、インクリメント(+1)

    するのはいかがでしょうか?以下のようなコードです。

    ####################################

    # カレントディレクトリにtest1~test5を作成
    $Targets = ("test1", "test2", "test3", "test4", "test5")
    foreach($i in $Targets){
        New-Item $i -Force
    }

    # カウンターを初期化
    $count = 0
    foreach($i in $DeleteTarget)
    {
      # 削除処理
      # 今回はtest1とtest2だけを削除する。削除後にカウンターをインクリメント
      if ($i -eq "test1" -or "test2")
      {
        Remove-Item $i -Recurse
        $count ++
      }
      # ログ出力
      Write-Host "$iを削除しました"
    }

    Write-Host "削除件数 ${count}件"

    ####################################

    2019年10月10日 11:12
  • チャブーンです。

    この件ですが、現時点では単純に「構文ミス」のように思います。

    foreach($DeleteTarget IN $DeleteTarget)

    ですが、Foreach ($a in $b) の場合、$bは必ず配列、$aは要素になります。この文脈では配列と要素に同じ変数名を使おうとしているので、おかしなことになっているのかと思います。

    そうではない、ということなら、最小限のソースと(実行時の)エラーメッセージ全文や「期待しなかった結果」情報がないと、誰も答えられないと思います。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2019年10月10日 11:14
  • チャブーンです。

    この件、「やりたいこと」がタイトルにあった、ということなのですね。失礼しました。PowerShellですが、Get-ChildItemでオブジェクト化したものを、メソッド .delete()で削除すると、.exsistsプロパティで削除の有無を確認できます。これを使うと、うまくいくのではないでしょうか?

    $RootDir="<ルートフォルダーパス>"
    $DeletedItems=@()
    $DeleteTargets=Get-ChildItem $RootDir 
    
    Foreach ($DeleteTarget in $DeleteTargets) {
    	$DeleteTarget.delete()
    	$DeleteTarget.refresh()
    	$DeletedItems += $DeleteTarget.exists
    	Write-Host $DeleteTarget.fullname は現在 $DeleteTarget.exists です。
    }
    
    Write-Host 削除されたファイル数は ($DeletedItems|Where {$_ -eq $false}).count です。	


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2019年10月10日 11:46
  • -Recurseがあるってことはサブディレクトリの存在が想定されるということなんでしょうが、サブディレクトリ自身を数に数えるのかどうか。あるいはサブディレクトリは配下のファイルもまとめて1つとして数えるのでしょうか?
    2019年10月10日 12:00
  • チャブーンです。

    Hongliangさん、ありがとうございます。ひとまずディレクトリ数も数え、かつ分けて数える前提で、書いてみました。かなり美しくないスクリプトですが。

    $RootDir="<ルートフォルダーパス>"
    $DeletedItems=@()
    $DeletedDirectories=@()
    $DeleteTargets=Get-ChildItem $RootDir -recurse
    
    Foreach ($DeleteTarget in ($DeleteTargets|Where {$_.attributes -ne "Directory"})) {
    	$DeleteTarget.delete()
    	$DeleteTarget.refresh()
    	$DeletedItems += $DeleteTarget.exists
    	
    	Write-Host $DeleteTarget.fullname は現在 $DeleteTarget.exists です。
    }
    
    Foreach ($DeleteTarget in ($DeleteTargets|Where {$_.attributes -eq "Directory"})) {
    	$DeleteTarget.delete()
    	$DeleteTarget.refresh()
    	$DeletedDirectories += $DeleteTarget.exists
    	
    	Write-Host $DeleteTarget.fullname は現在 $DeleteTarget.exists です。
    }
    
    
    Write-Host 削除されたファイル数は ($DeletedItems|Where {$_ -eq $false}).count です。
    Write-Host 削除されたディレクトリ数は ($DeletedDirectories|Where {$_ -eq $false}).count です。	


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2019年10月10日 12:23
  • チャブーンさん

    ありがとうございます。上記の回答で実現することができました。

    サブディレクトリはありますが、今回は削除したファイルの総数を表示させたかったため、

    こちらの回答をマークさせていただきました。

    2019年10月11日 1:17