【问题标题】:Get-childitem is not working with foreach loopGet-childitem 不适用于 foreach 循环
【发布时间】:2020-10-28 07:57:39
【问题描述】:

试图从多个路径中删除文件,

因此创建了一个 csv 文件,例如路径、天数、过滤器

在 shell 中导入此文件并遍历每个对象以删除内容,但 getchilditem 一次又一次地失败, 无法理解背后的原因,

下面是我想要实现的代码

Start-Transcript -Path "D:\delete.log"

$pathlist= Import-csv -LiteralPath "D:\diskpath.csv"
$count = 0

foreach($p in $pathlist){

    Write-host $p.path " | " $p.days -ForegroundColor DarkCyan
    $path = $p.path
    $days = $p.days
    $filter = $p.filter

    Get-ChildItem -Path $path -Filter $filter | where-object{$_.LastWriteTime -lt [datetime]::Now.AddDays(-$days)}|Remove-Item -Force -Verbose -Recurse -ErrorAction SilentlyContinue -Confirm $false
    
}


Stop-Transcript

没有for循环,脚本可以正常执行,但是有for循环会失败

如果需要有关此查询的任何进一步信息,请告知, 会喜欢提供相同的, 已经在 SO 上谷歌并阅读了多个问题,但无法找到失败的原因,

【问题讨论】:

  • “失败”是什么意思?没有文件被删除?删除了错误的文件?错误信息?
  • 顺便说一句,Confirm 的默认值为 False,因此您可以忽略它或使用正确的语法:-Confirm:$false。另外,请向我们展示您的 D:\diskpath.csv 文件的前 3 或 4 行的文本,以便我们查看那里是否有任何问题。
  • -Confirm 是一个开关参数,在这种情况下默认为$false。如果您想为开关提供变量,请不要使用空格,而是使用 : > -Confirm:$false / -Confirm:$VarWithBool。如果您留出空格,则开关参数将被视为$true,而下一个定位参数将获得$false...
  • @vonPryz 失败,意味着它没有删除任何文件,也没有显示任何详细信息,但是如果在变量中提供共享路径并且在没有 for 循环的情况下传递它,则它可以工作

标签: powershell automation powershell-4.0


【解决方案1】:

@T-Me 和@Theo

感谢您突出显示错误,我没有在脚本中看到类型错误,而在 PowerShell 中手动输入时写入正确,但在脚本中出错,现在可以正常工作-

Start-Transcript -Path "D:\delete.log"

$pathlist= Import-csv -LiteralPath "D:\diskpath.csv"
$count = 0

foreach($p in $pathlist){

    Write-host $p.path " | " $p.days -ForegroundColor DarkCyan
    $path = $p.path
    $days = $p.days
    $filter = $p.filter

    Get-ChildItem -Path $path -Filter $filter | where-object{$_.LastWriteTime -lt [datetime]::Now.AddDays(-$days)}|Remove-Item -Force -Verbose -Recurse
    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多