You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell使用CSV批量清理过期语音邮件脚本路径错误求助

问题分析与解决方案

从错误信息里能明显看到核心问题:你的路径被解析成了C:\Users@{USER=jdough}\AppData\...,这说明PowerShell把$user当成了整个CSV对象来输出,而不是你想要的纯用户名字符串。

为什么会出现这个问题?

当你用Import-Csv处理仅包含一行jdough的CSV文件时,PowerShell会默认把这一行当作表头,而不是数据行。也就是说,导入后的$csv其实是一个没有有效数据的对象;如果你的CSV实际是有表头USER、第二行才是jdough(可能你描述时简化了),那直接使用$user会输出对象的字符串表示(@{USER=jdough}),而非提取USER属性对应的用户名。

修复方案有两种:

方案1:修正CSV文件(推荐)

给CSV添加一个表头行,让Import-Csv能正确识别数据结构,CSV内容改成:

USER
jdough

然后修改脚本,明确引用对象的USER属性:

$csv = Import-Csv "\\Server\Name\User_Base_test.csv"
foreach ($user in $csv) {
    $username = $user.USER
    # 先打印路径确认是否正确
    Write-Host "Processing path: C:\Users\$username\AppData\Roaming\Zultys\MX Settings\$username.vm\Voice Messages\Deleted\"
    Get-ChildItem "C:\Users\$username\AppData\Roaming\Zultys\MX Settings\$username.vm\Voice Messages\Deleted\" -Recurse | 
        Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | 
        Remove-Item -WhatIf # 先加-WhatIf模拟删除,确认路径正确后再移除该参数
}

方案2:不修改CSV,改用Get-Content

如果你的CSV确实只有一行纯用户名(无表头),用Get-Content直接读取每行字符串更合适,它不需要表头支持:

$users = Get-Content "\\Server\Name\User_Base_test.csv"
foreach ($username in $users) {
    Write-Host "Processing user: $username"
    Get-ChildItem "C:\Users\$username\AppData\Roaming\Zultys\MX Settings\$username.vm\Voice Messages\Deleted\" -Recurse | 
        Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | 
        Remove-Item -WhatIf # 测试阶段保留,确认无误后删除
}

额外提示

  • 加上-WhatIf参数可以模拟删除操作,不会实际删除文件,方便你验证路径是否正确解析。
  • 添加Write-Host输出当前处理的用户名或路径,能快速排查循环中的变量是否符合预期。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:07:38