2016-05-19 3 views
0

最も基本的な意味では、IDの配列を返すSQLクエリがあります。これは変数$IDに格納されています。私は、その後にIDのいずれかを含む任意のファイル名の特定のフォルダにGet-childitemを実行する可能性が存在する三つの可能なファイル名がある変数($ID)言った:Arrayとget-childitemを使用して特定のIDを持つファイル名を検索する

  • $ID.xml
  • $ID_input.xml
  • $ID_output.xml

結果がget-childitemになると、これをテキストファイルとして出力し、フォルダからファイルを削除します。私が問題を抱えている部分は、get-childitemの結果をフィルタリングして、探しているファイル名を定義しているため、SQL出力の​​IDを含むファイルだけがget-childitemの結果に表示されます。

私はその中から所望のファイル名を構築し、その上に削除項目を実行し、for-each ($i in $id)を使用することにより、正常に動作しますこれを行うための別の方法を見つけた:

# Build list of XML files 
$XMLFile = foreach ($I in $ID) 
     { 
      "$XMLPath\$I.xml","$XMLPath\$I`_output.xml","$XMLPath\$I`_input.xml" 
     } 

# Delete XML files 
$XMLFile | Remove-Item -Force 

しかし、これはエラーの多くを生産します存在しないがIDがデータベースに存在するファイルを削除しようとするときに、シェル内で実行されます。私はまた、実際に削除されたファイルのテキスト出力をどのようにして作成するのか、この方法では理解できないので、可能であればget-childitemのアプローチに戻したいと思います。

アイデアをいただければ幸いです。より多くの情報が必要な場合は、尋ねてください。

答えて

0

あなたがテストしてからファイル名を一致させるために正規表現を使用するファイルの数を最小限に抑えるためにGet-ChildItemをすべて*.xmlのファイルを見つけることができます。ループ/複数テストよりも高速ですが、正規表現に慣れていない場合は読みにくいです。

$id = 123,111 

#Create regex-pattern (search-pattern) 
$regex = "^($(($id | ForEach-Object { [regex]::Escape($_) }) -join '|'))(?:_input|_output)?$" 

$filesToDelete = Get-ChildItem -Path "c:\users\frode\Desktop\test" -Filter "*.xml" | Where-Object { $_.BaseName -match $regex } 

#Save list of files 
$filesToDelete | Select-Object -ExpandProperty FullName | Out-File "deletedfiles.txt" -Append 

#Remove files (remove -WhatIf when ready) 
$filesToDelete | Remove-Item -Force -WhatIf 

正規表現のデモ:あなたの助けのためのhttps://regex101.com/r/dS2dJ5/2

+0

どうもありがとうございました。これは素晴らしい仕事でした。私が変更しなければならなかったもう1つのことがありました。 Select-Object -ExpandProperty id。変数$ IDに格納されているSQLクエリの出力はオブジェクト型でしたが、文字列の配列として必要でしたので、これを行う必要がありました。 – MikeT

+0

そのため、サンプル '$ id'を追加したので、値がどのようになっているか知ることができます。私はたぶん '$ id = $ sqlresults | select-object -expand id'という変数名自体がIDだと言っていますが、これはちょっとした情報です:-)幸運な "Powershelling" –

0

これを試してみてください:

clear 
$ID = "a", "b", "c" 
$filesToDelete = New-Object System.Collections.ArrayList 
$files = Get-ChildItem e:\ 
foreach ($I in $ID) 
    { 
     ($files | Where-object { $_.Name -eq "$ID.xml" }).FullName | ForEach-Object { $filesToDelete.Add($_) } 
     ($files | Where-object { $_.Name -eq "$ID_input.xml" }).FullName | ForEach-Object { $filesToDelete.Add($_) } 
     ($files | Where-object { $_.Name -eq "$ID_output.xml" }).FullName | ForEach-Object { $filesToDelete.Add($_) } 
    } 
$filesToDelete | select-object -Unique | ForEach-Object { Remove-Item $_ -Force } 
関連する問題