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
问题分析与修正方案
管道输入变量不匹配:
函数参数定义为$paths,但Process块中错误使用了自动变量$_,管道传递的文件对象实际存储在$paths中,导致$_为空,判断逻辑完全失效。需将参数名改为更语义化的$file,并在代码中统一使用该变量。Like运算符缺少通配符:
-Like "_ch_"是精确匹配文件名等于"ch"的文件,要实现包含匹配,必须添加通配符:-Like "*_ch_*"。$input自动变量误用:
Split-Path $input -leaf错误使用了$input自动变量,直接使用文件对象的.Name属性即可获取文件名。输出语句属性错误:
$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
相关产品推荐
相关产品推荐

