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

PowerShell脚本问题:含_ch_的.dgn文件无法触发删除逻辑

PowerShell脚本问题:无法触发文件名判断的删除/移动操作

需求:遍历指定目录下的.dgn格式文件,若文件名包含"ch"则删除该文件,否则将其移动到指定新目录。但现有脚本的IF判断逻辑无法触发删除或输出操作,尝试多种判断语句均无效,原脚本如下:

Function Remove-ExtraneousCADFiles {
    [CmdletBinding()]
    Param (
    [Parameter(ValueFromPipeline = $true)]
        $paths
    )
    Begin {Clear-Host}
    Process {
    $char = "_ch_"
    $fileName = Split-Path $input -leaf
    $destDir = "D:\CRASH\ACCID - Lite Test\"
    Write-Output ("fileName= " + $fileName)
    Write-Output ("char= " + $char)
    Write-Output ("_.Name= " + $_.Name)
    #if ($_.contains($char)) {
    #if (Where $_.Name -Match $char) {
    #if ($_.Name -Match $char) {
    if ($_.Name -Like $char) {
    Remove-Item $_ -Force -Confirm -WhatIf
    Write-Output ("Delete= " + $fileName.Name)
    }
    else {
    Move-Item -Path $_.FullName -Destination ($destDir + $_.BaseName + $_.Extension) -WhatIf
    Write-Output ""
    }
    }
    End {}
}
$inputPath = "D:\CRASH\ACCID - Lite Test zzz"
(Get-ChildItem -Path $inputPath -Recurse -Include *.dgn) | Remove-ExtraneousCADFiles

问题分析与修正方案

  1. 管道输入变量不匹配:
    函数参数定义为$paths,但Process块中错误使用了自动变量$_,管道传递的文件对象实际存储在$paths中,导致$_为空,判断逻辑完全失效。需将参数名改为更语义化的$file,并在代码中统一使用该变量。

  2. Like运算符缺少通配符:
    -Like "_ch_"是精确匹配文件名等于"ch"的文件,要实现包含匹配,必须添加通配符:-Like "*_ch_*"。

  3. $input自动变量误用:
    Split-Path $input -leaf错误使用了$input自动变量,直接使用文件对象的.Name属性即可获取文件名。

  4. 输出语句属性错误:
    $fileName是字符串类型,没有.Name属性,直接使用$file.Name即可输出正确文件名。

修正后的脚本

Function Remove-ExtraneousCADFiles {
    [CmdletBinding()]
    Param (
        [Parameter(ValueFromPipeline = $true)]
        $file  # 修正参数名,与管道输入对象对应
    )
    Begin {Clear-Host}
    Process {
        $char = "_ch_"
        $destDir = "D:\CRASH\ACCID - Lite Test\"
        Write-Output ("当前文件: " + $file.Name)
        Write-Output ("匹配字符串: " + $char)

        # 使用带通配符的Like运算符判断文件名是否包含指定字符串
        if ($file.Name -Like "*$char*") {
            Remove-Item $file.FullName -Force -Confirm -WhatIf
            Write-Output ("已标记删除: " + $file.Name)
        }
        else {
            # 用Join-Path拼接路径,避免手动拼接的分隔符问题
            $destPath = Join-Path -Path $destDir -ChildPath $file.Name
            Move-Item -Path $file.FullName -Destination $destPath -WhatIf
            Write-Output ("已标记移动: " + $file.Name + " -> " + $destPath)
        }
    }
    End {}
}

$inputPath = "D:\CRASH\ACCID - Lite Test zzz"
# 改用-Filter替代-Include,递归遍历效率更高
Get-ChildItem -Path $inputPath -Recurse -Filter *.dgn | Remove-ExtraneousCADFiles

额外优化说明

  • 使用Join-Path拼接路径,避免手动字符串拼接可能出现的路径分隔符错误。
  • 将-Include *.dgn改为-Filter *.dgn,递归遍历文件时执行效率更高。
  • 保留-WhatIf参数用于测试逻辑,确认无误后可移除该参数执行实际操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:36:00