2

Я перемещаю группу файлов из каталога и использую модификатор -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 ответ1

2

Я бы переписал выражение следующим образом:

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).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .