Powershell - 根据另一个文件的存在删除一个文件
Powershell - Delete a file based on the existence of another file
我正在尝试创建一个 Powershell 脚本,仅当另一个文件与要删除的文件位于同一文件夹中时,该脚本才会删除特定文件。到目前为止,我所有的尝试都没有结果。这是我正在使用的文件夹结构的示例:
根文件夹
- Client1文件夹
- 子文件夹
- abc1.txt
- abc1_control.txt
- def1.txt
- def1_control.txt
- ...其他文件
- 客户端2文件夹
- 子文件夹
- abc2.txt
- abc2_control.txt
- ...其他文件
- Client3文件夹
- 子文件夹
- abc3.txt
- def3.txt
- ...其他文件(但没有 _control.txt 个文件)
- Client4文件夹
- 子文件夹
- abc4.txt
- abc4_control.txt
- ...其他文件
我希望能够做的是当相应的 abc*_control.txt 文件存在于文件夹中时删除 abc*.txt 文件(所以在这个例子中我希望能够删除 abc1.txt、abc2.txt 和 abc4.txt、 但不是 abc3.txt 或 def1.txt、def3.txt 等)。我还希望能够在完成删除 abc*.txt 文件后删除 abc*_control.txt 文件,但这应该是微不足道的。
我可以通过在 Windows 资源管理器中手动搜索并以这种方式删除它们来找到我需要删除的文件,但是考虑到这个根文件夹中有超过 200 个客户端,我需要删除两个文件,任何帮助将不胜感激。
您可以使用 Get-ChildItem
递归查找“*_control.txt”文件,并从这些文件构造 'other file',然后您可以将其删除:
Get-ChildItem -Path $rootFolder -Filter 'abc*_control.txt' -File -Recurse |
ForEach-Object {
# construct the full path and name of the 'other file'
$toDelete = '{0}\{1}{2}' -f $_.DirectoryName, ($_.BaseName -replace '_control$'), $_.Extension
if (Test-Path -Path $toDelete -PathType Leaf) {
Remove-Item -Path $toDelete -WhatIf
# remove the *_control.txt file as well?
# $_ | Remove-Item -WhatIf
}
}
请注意,我已将 -WhatIf
开关添加到 Remove-Item cmdlet。这是一项安全措施,使用该开关,您只会在控制台中看到一行,告诉您 将 执行什么操作。实际上没有任何内容被删除。
一旦您对所有控制台消息感到满意,即一切都按预期进行,您可以删除该 -WhatIf
开关。
我正在尝试创建一个 Powershell 脚本,仅当另一个文件与要删除的文件位于同一文件夹中时,该脚本才会删除特定文件。到目前为止,我所有的尝试都没有结果。这是我正在使用的文件夹结构的示例:
根文件夹
- Client1文件夹
- 子文件夹
- abc1.txt
- abc1_control.txt
- def1.txt
- def1_control.txt
- ...其他文件
- 子文件夹
- 客户端2文件夹
- 子文件夹
- abc2.txt
- abc2_control.txt
- ...其他文件
- 子文件夹
- Client3文件夹
- 子文件夹
- abc3.txt
- def3.txt
- ...其他文件(但没有 _control.txt 个文件)
- 子文件夹
- Client4文件夹
- 子文件夹
- abc4.txt
- abc4_control.txt
- ...其他文件
- 子文件夹
我希望能够做的是当相应的 abc*_control.txt 文件存在于文件夹中时删除 abc*.txt 文件(所以在这个例子中我希望能够删除 abc1.txt、abc2.txt 和 abc4.txt、 但不是 abc3.txt 或 def1.txt、def3.txt 等)。我还希望能够在完成删除 abc*.txt 文件后删除 abc*_control.txt 文件,但这应该是微不足道的。
我可以通过在 Windows 资源管理器中手动搜索并以这种方式删除它们来找到我需要删除的文件,但是考虑到这个根文件夹中有超过 200 个客户端,我需要删除两个文件,任何帮助将不胜感激。
您可以使用 Get-ChildItem
递归查找“*_control.txt”文件,并从这些文件构造 'other file',然后您可以将其删除:
Get-ChildItem -Path $rootFolder -Filter 'abc*_control.txt' -File -Recurse |
ForEach-Object {
# construct the full path and name of the 'other file'
$toDelete = '{0}\{1}{2}' -f $_.DirectoryName, ($_.BaseName -replace '_control$'), $_.Extension
if (Test-Path -Path $toDelete -PathType Leaf) {
Remove-Item -Path $toDelete -WhatIf
# remove the *_control.txt file as well?
# $_ | Remove-Item -WhatIf
}
}
请注意,我已将 -WhatIf
开关添加到 Remove-Item cmdlet。这是一项安全措施,使用该开关,您只会在控制台中看到一行,告诉您 将 执行什么操作。实际上没有任何内容被删除。
一旦您对所有控制台消息感到满意,即一切都按预期进行,您可以删除该 -WhatIf
开关。