使用 Array 和 get-childitem 查找具有特定 ID 的文件名
Using Array and get-childitem to find filenames with specific ids
在最基本的意义上,我有一个 SQL 查询,其中 returns 一个 ID 数组,我已将其存储到变量 $ID
中。然后我想在特定文件夹上对包含所述变量中任何 ID 的任何文件名执行 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
然而,这会在 shell 中产生很多错误,因为它试图删除不存在但其 ID 确实存在于数据库中的文件。我也不知道如何以这种方式生成实际删除的文件的文本输出,所以如果可能的话,我想回到 get-childitem
方法。
如有任何想法,我们将不胜感激。如果您需要更多信息,请询问。
试试这个:
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 }
您可以找到所有 *.xml
个带有 Get-ChildItem
的文件,以尽量减少要测试的文件数量,然后使用正则表达式匹配文件名。它比 loop/multiple 测试更快,但如果您不熟悉正则表达式则更难阅读。
$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
在最基本的意义上,我有一个 SQL 查询,其中 returns 一个 ID 数组,我已将其存储到变量 $ID
中。然后我想在特定文件夹上对包含所述变量中任何 ID 的任何文件名执行 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
然而,这会在 shell 中产生很多错误,因为它试图删除不存在但其 ID 确实存在于数据库中的文件。我也不知道如何以这种方式生成实际删除的文件的文本输出,所以如果可能的话,我想回到 get-childitem
方法。
如有任何想法,我们将不胜感激。如果您需要更多信息,请询问。
试试这个:
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 }
您可以找到所有 *.xml
个带有 Get-ChildItem
的文件,以尽量减少要测试的文件数量,然后使用正则表达式匹配文件名。它比 loop/multiple 测试更快,但如果您不熟悉正则表达式则更难阅读。
$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