我正在从目录中移动一组文件,并使用-exclude
修饰符排除带有 .gpg 扩展名的文件:
Move-Item -path $encrypted_folder\*.* -EXCLUDE *.gpg -destination $final_dir
虽然通过移动每个非 .gpg 文件可以正常工作,但每次Move-Item
遇到 .gpg 文件时都会出现以下错误:
Move-Item : Cannot move item because the item at 'C:\Users\ThisUser\Documents\PGP Encryption test\UUID\xxxx.gpg' does not exist.
At C:\Users\ThisUser\Documents\PGP Encryption test\yyyy.ps1:41 char:1
+ Move-Item -path $encrypted_folder\*.* -EXCLUDE *.gpg -destination $final_dir
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Move-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand
当我将命令设置为排除 .gpg 项目(这些项目肯定存在)时,为什么它会抱怨无法移动 .gpg 项目,因为它不存在?排除正在发生,并且对-include
.gpg 文件的后续命令运行正常,但我对命令中的错误不满意-exclude
。
答案1
我将把该表达式重写如下:
gci $encrypted_folder\*.* -exclude *.gpg | move-item -destination $final_dir
您还可以使用where-object
和构建更复杂的过滤器-match/notmatch
,例如,仅排除扩展前具有 4 个或更多字符的那些:
gci |? name -notmatch '^.{4,}\.gpg$' | [rest of processing here]
解释
正如评论中指出的,此处报告了此错误:https://github.com/PowerShell/PowerShell/issues/2385。我也可以在 PS 4 中复制它:
$psversiontable
Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.42000
BuildVersion 6.3.9600.18728
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
New-Item -Name "foo.txt" -ItemType File
New-Item -Name "bar.txt" -ItemType File
Move-Item -Path ".\*" -Destination "move.txt" -Exclude "bar*"
Move-Item : Cannot move item because the item at 'C:\temp\test\bar.txt' does not exist.
At line:1 char:1
+ Move-Item -Path ".\*" -Destination "move.txt" -Exclude "bar*"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Move-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand
尚未发布的版本 6 已修复此问题(https://github.com/PowerShell/PowerShell/tree/v6.0.0-beta.5)。