【问题标题】:powershell script to delete x days old file automatically. pass two parameters in it one for path of file and other one for no. of days to keep filespowershell 脚本自动删除 x 天前的文件。在其中传递两个参数,一个用于文件路径,另一个用于否。保留文件的天数
【发布时间】:2021-09-01 04:56:00
【问题描述】:

我想编写一个用于使用记事本自动删除文件夹的 PowerShell 脚本,并且我还想向该脚本添加 2 个参数。每当我运行此脚本时,它都会询问路径和否。天旧文件。

Param1 - location of the folder
Param2 - no. Of days to keep

$param1 = Read-Host -Prompt 'location of the folder'
$param2 = Read-Host -Prompt 'no. of days to keep'
Get-ChildItem $param1 -recurse  | 
    Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays($param2)} | 
    Remove-Item

有没有办法在 PowerShell 脚本中传递参数?在我的代码中,param1 正在接受输入,但 param2 没有接受任何输入。

【问题讨论】:

  • 运行时会出现 2 个提示输入要输入的参数。你是如何调用脚本的?
  • 是的,出现 2 个参数提示,但 param2 的值没有更新任何内容。无论是 15 天还是 1000 天,这段代码总是删除文件,我想设置否。天。当我尝试使用 write-host 逐行打印此代码时,它只打印到第一个垂直条并更新 param1 但不更新 param2。
  • 感谢 Lieven Keersmaekers 编辑此脚本。只有缩进错误。感谢您解决此问题。

标签: windows powershell parameter-passing powershell-2.0 powershell-3.0


【解决方案1】:

首先 - 请正确命名您的参数 - 它更易于阅读。 :)

第二 - 如果你想要比 x 更老 - 你必须.AddDays(-$days)

所以它可能看起来像这样:

$path = Read-Host -Prompt 'location of the folder'
$days = Read-Host -Prompt 'no. of days to keep'
Get-ChildItem $path -Recurse  | 
    #Mind the -$days (so we are looking for older than (today - X days)
    Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$days) } | 
    Remove-Item #-WhatIf #for testing

【讨论】:

    【解决方案2】:

    概念和Grzegorz's helpful answer一样,只是添加了一些输入验证和错误处理。

    $ErrorActionPreference = 'Stop'
    
    $param1Block = {
        try
        {
            [validatescript({Test-Path $_})]$z = Read-Host -Prompt 'location of the folder'
            $z
        }
        catch
        {
            Write-Warning 'Invalid Path, try again.'
            & $param1Block
        }
    }
    
    $param2Block = {
        try
        {
            [int](Read-Host -Prompt 'no. of days to keep')
        }
        catch
        {
            Write-Warning 'Only integers accepted, try again.'
            & $param2Block
        }
    }
    
    $param1 = & $param1Block
    $param2 = & $param2Block
    
    if([math]::Sign($param2) -ne -1)
    {
        $param2 = -$param2
    }
    
    Get-ChildItem $param1 -Recurse |
    Where-Object -Property LastWriteTime -LT ([datetime]::Now).AddDays($param2) |
    Remove-Item
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2013-02-02
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      相关资源
      最近更新 更多