我有一个可以递归删除文件和文件夹的脚本,它可以选择打开详细程度,但有时您不希望将数十万个文件名写入主机。
在这种情况下,每隔几秒它就会使用 -NoNewLine 将“x 条记录已删除”写入主机
我想也许这需要被包装成一个作业或者其他什么东西,但我真的不知道如何对本地脚本做到这一点,如果是远程的,我会使用invoke-command或者其他什么东西
以下是尾部递归删除内容的脚本
function RecurseFolderDelete {
Write-Host "* is greedy wildcard"
Write-Host "? is non greedy wildcard"
$term= Read-Host -Prompt "enter search term to delete"
Write-Host "all folders and files with the term '$term' in current directory will be deleted"
$reply = Read-Host -Prompt "Continue?[y/n]"
if ( $reply -match "[yY]" ) {
$verbosity = Read-Host -Prompt "verbose? [y/n]"
if ( $verbosity -match "[yY]" ) {
Get-ChildItem -Recurse -Filter "$term" -Directory | remove-item -Recurse -Verbose -Force
}
if ( $verbosity -match "[nN]" ) {
Get-ChildItem -Recurse -Filter "$term" -Directory | remove-item -Recurse -Force
}
}
}
答案1
好的,在@spikey_richie 的帮助下,我找到了以下答案
添加
Where-Object { Write-Progress "Deleting $($_.Fullname)"; $true }
并将 Get-ChildItem 的结果传输给它会产生一种工作方法,显示当前正在处理的文件夹,它可能需要改进,但这对我来说已经足够了。
如果将 remove-item 传送至 where-object,您将获得更频繁更新的进度条。
新脚本是这个
function RecurseFolderDelete {
Write-Host "* is greedy wildcard"
Write-Host "? is non greedy wildcard"
$term= Read-Host -Prompt "enter search term to delete"
Write-Host "all folders and files with the term '$term' in current directory will be deleted"
$reply = Read-Host -Prompt "Continue?[y/n]"
if ( $reply -match "[yY]" ) {
$verbosity = Read-Host -Prompt "verbose? [y/n]"
if ( $verbosity -match "[yY]" ) {
Get-ChildItem -Recurse -Filter "$term" -Directory | remove-item -Recurse -Verbose -Force
}
if ( $verbosity -match "[nN]" ) {
Get-ChildItem -Recurse -Filter "$term" -Directory | Where-Object { Write-Progress "Deleting $($_.Fullname)"; $true } | remove-item -Recurse -Force
}
}
}
如果有人想进一步完善这一点,提供一个提示,看看某个文件夹是否花了很长时间,或者提供其他一些方面,让它更干净一点,那就太好了,如果@spikey_richie 想把这个作为答案发布出来,我会删除这个,并接受他们的