【问题标题】:How can I delete files with PowerShell without confirmation?如何在不确认的情况下使用 PowerShell 删除文件?
【发布时间】:2020-02-13 04:47:05
【问题描述】:

我正在尝试让下面的 PowerShell 脚本使用任务计划程序工作。问题是它不会删除任何文件。

当我手动运行它时,它需要在删除文件之前进行确认。

Recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want
 to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

如何编辑此脚本以删除文件而无需任何确认,以便我可以使用任务计划程序运行它?

#----- define parameters -----#
#----- get current date ----#
$Now = Get-Date
#----- define amount of days ----#
$Days = "10"
#----- define folder where files are located ----#
$TargetFolder = "D:\Shares\Downloads\TV\AutoDL"
#----- define extension ----#
$Extension = "*.*"
#----- define LastWriteTime parameter based on $Days ---#
$LastWrite = $Now.AddDays(-$Days)

#----- get files based on lastwrite filter and specified folder ---#
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}

foreach ($File in $Files) 
{
    if ($File -ne $NULL)
    {
        write-host "Deleting File $File" -ForegroundColor "DarkRed"
        Remove-Item $File.FullName | out-null
    }
    else
    {
        Write-Host "No more files to delete!" -foregroundcolor "Green"
    }
}

【问题讨论】:

  • Get-Help Remove-Item -Examples
  • Powershell 就像,false 需要 $ 除非它不需要。

标签: powershell


【解决方案1】:
Remove-Item foldertodelete -Recurse -Force -Confirm:$false

为我工作。

【讨论】:

  • 一个陷阱...我相信项目/对象是一个文件夹/目录,其中还包含文件,然后不包括 -Recurse 而包括 -Confirm:$false 将导致确认。仔细查看确认,因为它以 The item at <some-folder-pathname> has children and the Recurse parameter was not specified. 开头,关于缺少的 -Recurse 开关。
  • 这里为什么是-confirm:$false?当我测试时:尝试 { Remove-Item .\bin -Confirm:False } catch{ } 不确认。 try { Remove-Item .\bin -Confirm:$false } catch{ } 确实确认。 Powershell 肯定是狡猾和怪异的。
  • @Warren P 当你省略$ 时,PS 会抛出一个 ParameterBindingException,你会在你的代码行中捕获它。当然,如果它抛出,它不会要求确认......
【解决方案2】:

您需要将-Confirm:$false 添加到Remove-Item 命令以覆盖默认确认行为。如果失败,请尝试添加-Force

【讨论】:

  • 当存在文件夹时,由于某种原因,这对我不起作用。
  • 试试这个 --> try { Remove-Item .\bin -Confirm:False } catch{ }
【解决方案3】:

在我看来,Remove-Item -Path "C:\Temp\FolderToDelete" -Confirm:$false -Force 应该在没有 any 提示的情况下工作。但事实并非如此。

要删除整个文件夹及其中的所有内容没有任何提示,我必须使用 GCI 并提升一个级别。所以而不是:

Get-ChildItem -Path "C:\Temp\FolderToDelete" | Remove-Item -Recurse -Confirm:$false -Force

这会删除 FolderToDelete 中的所有内容,但不会删除父文件夹。

要在没有提示的情况下删除父文件夹及其中的所有内容,我这样做了:

Get-ChildItem -Path "C:\Temp\" -Directory -Filter "FolderToDelete" | Remove-Item -Recurse -Confirm:$false -Force

注意-Path C:\Temp\ 中的尾随“\”。

HTH

【讨论】:

  • 同意你的 -Recurse。对我来说,Remove-Item 总是询问我有 * 到路径结束的提示。谢谢。
【解决方案4】:

删除D:\FOLDER 上的文件夹\子文件夹(我的示例如下),任何超过 30 天的文件。

Get-ChildItem -Path "D:\FOLDER\" -Recurse |? {($_.LastWriteTime -lt (Get-Date).AddDays(-30))} | Remove-Item -Recurse -Force -confirm:$false -Verbose

-Force -Confirm:$false 保证您不必在每次删除文件或文件夹时按YA-Verbose 显示正在删除的内容。

【讨论】:

    【解决方案5】:

    上面写着

    没有指定递归参数。如果您继续,所有子项都将与该项目一起被删除。确定要继续吗?

    尝试: Remove-Item ./folderToDelete -Force -Recurse

    【讨论】:

    • 你能详细说明一下这个答案吗?
    • 是的。我的意思是,如果提示说由于缺少递归开关参数需要确认,则应该添加递归参数。
    【解决方案6】:

    你可以像这样简化你的脚本:

    1. -fileGet-Childitem 命令一起使用
    2. 不必有$Now 变量
    3. 为您的位置使用别名(更好的可见性)
    4. 您的if 必须外出检查是否没有文件
    5. -Force 添加到您的Remove-Item 命令中
    6. 如果您使用'\*.*',则无需扩展

    已批准的代码:

    $Days = "10"
    #----- define folder where files are located ----#
    $TargetFolder = "D:\Shares\Downloads\TV\AutoDL"
    #----- define LastWriteTime parameter based on $Days ---#
    $LastWrite = (Get-Date).AddDays(-$Days)
    
    #----- get files based on lastwrite filter and specified folder ---#
    $Files = Get-Childitem $TargetFolder -Recurse -file | Where LastWriteTime -le "$LastWrite"
    
    if ($Files -eq $null)
    {
        Write-Host "No more files to delete!" -foregroundcolor "Green"
    }
    else
    {
       $Files | %{
       write-host "Deleting File $_" -ForegroundColor "DarkRed"
       Remove-Item $_.FullName -Force   | out-null
       }
    
    }
    

    【讨论】:

    • 谢谢,我试试看。这也会删除空的子文件夹吗?我的上一个脚本留下了所有空的子文件夹。
    【解决方案7】:

    这对我有用:

    Get-ChildItem -Path "FolderToDelete" -Directory -recurse |其中 {$_.LastWriteTime -le $(get-date).Adddays(-7)} |移除项目 -recurse -force

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2014-05-03
      相关资源
      最近更新 更多