PowerShell按文件名末尾奇数移动文件代码失效问题求解
脚本失效原因
两段代码分别存在以下语法和逻辑错误:
- 第一段代码错误点:
-match是正则匹配运算符,不支持通配符*的类文件系统匹配规则,也不支持直接传入多个匹配模式组成的数组,你写的'*1.txt'这类模式不符合正则语法,匹配逻辑完全失效。
- 第二段代码错误点:
$files直接赋值为源路径字符串,没有调用Get-ChildItem获取路径下的文件列表,循环遍历的对象只是一个路径文本,根本不是文件对象。- 调用
Move-Item时没有传入-Path参数指定要移动的源文件,参数缺失无法执行。 -like运算符同样不支持直接传入多个通配模式组成的数组作为匹配条件,写法本身存在语法错误。
正确实现方案
不需要逐一列举1、3、5、7、9的后缀匹配项,利用PowerShell通配符或正则的字符集匹配能力即可实现需求,同时补充必要的路径校验、预校验逻辑避免误操作:
$srcpath = "C:\Folder\SubFolder3" $dstpath = "C:\Folder\SubFolder2" # 校验目标文件夹是否存在,不存在则自动创建 if (-not (Test-Path -Path $dstpath -PathType Container)) { New-Item -ItemType Directory -Path $dstpath | Out-Null } Get-ChildItem -File -Recurse -Path $srcpath | ForEach-Object { # 匹配所有格式文件:取不带扩展名的文件名最后一位,判断是否为奇数字符 if ($_.BaseName[-1] -match '[13579]') { Move-Item -Path $_.FullName -Destination $dstpath -WhatIf } # 如果仅需要匹配txt格式文件,把上面的if判断替换为下面这行即可 # if ($_.Name -like '*[13579].txt') { # Move-Item -Path $_.FullName -Destination $dstpath -WhatIf # } }
初次运行请保留
-WhatIf参数,执行后控制台会输出所有待移动的文件预览,确认匹配结果完全符合预期后,再删除-WhatIf参数执行正式移动操作,避免误操作丢失文件。
内容的提问来源于stack exchange,提问作者gfran
相关产品推荐
相关产品推荐

