Powershell Move-Item работает, но показывает ошибку «процесс не может получить доступ к файлу, потому что он используется другим процессом».

У меня есть сценарий powershell, который запускает следующий сценарий, который успешно перемещает мои файлы и папки из текущей папки в папку назначения. Однако он показывает ошибку «процесс не может получить доступ к файлу, потому что он используется другим процессом».

Мой сценарий:

mkdir filestobehere
$dest = '.\filestobehere'
Move-Item .\* $dest -Exclude $dest -Force
I am stumped.

Я попытался поймать, но он не перехватывается, и я все еще получаю сообщение об ошибке.

mkdir filestobehere
Get-ChildItem -Path "./" |
ForEach-Object {
  $dest = '.\filestobehere'
  Try {
    Move-Item .\* $dest -Exclude $dest -Force
  }
  Catch {
    Write-Hose "File is in use"
  }
}

Move-Item: параметр Exclude эффективен только в том случае, если команда включает содержимое элемента, например C:\Windows\*, где подстановочный знак указывает содержимое каталога C:\Windows.
Theo 21.11.2022 13:14

@Theo, я думал, что могу использовать Exclude, так как мой исходный путь .* aka содержимое моего текущего каталога

Sienna 21.11.2022 13:21

Нет, вы устанавливаете Exclude на литеральную строку '.\filestobehere'

Theo 21.11.2022 13:23

@Theo Я добавил ErrorAction Stop к Move-Item, и теперь он печатает «Файл используется». Однако, если я пишу «Write-Host «Файл $($_.FullName) используется», интересно, почему он не записывает имя файла?

Sienna 21.11.2022 13:48

Это потому, что в блоке Catch вы не показываете настоящую ошибку, а только свой собственный текст "File is in use".. Измените его на $_.Exception.Message. Вы читали мой первый комментарий о переключателе -Exclude? Он не будет работать с путями к файлам, только с именами файлов.

Theo 21.11.2022 14:25
[JS за 1 час] - 9. Асинхронный
[JS за 1 час] - 9. Асинхронный
JavaScript является однопоточным, то есть он может обрабатывать только одну задачу за раз. Для обработки длительных задач, таких как сетевые запросы,...
Топ-10 компаний-разработчиков PHP
Топ-10 компаний-разработчиков PHP
Если вы ищете надежных разработчиков PHP рядом с вами, вот список лучших компаний по разработке PHP.
Скраппинг поиска Apple App Store с помощью Python
Скраппинг поиска Apple App Store с помощью Python
📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что...
Редкие достижения на Github ✨
Редкие достижения на Github ✨
Редкая коллекция доступна в профиле на GitHub ✨
Подъем в javascript
Подъем в javascript
Hoisting - это поведение в JavaScript, при котором переменные и объявления функций автоматически "перемещаются" в верхнюю часть соответствующих...
Улучшение генерации файлов Angular
Улучшение генерации файлов Angular
Angular - это фреймворк. Вы можете создать практически любое приложение без использования сторонних библиотек.
1
5
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указано в комментариях, основная проблема с вашей попыткой заключается в том, что вы используете путь в качестве аргумента -Exclude, который не поддерживается.[1]

В результате попытка исключения неэффективна, и Move-Item пытается переместить подкаталог filestobehere в себя, что предсказуемо терпит неудачу (однако я вижу другую ошибку).

Хотя использование только имени файла с -Exclude устраняет проблему с вашей командой в PowerShell (Core) 7+, ошибка в Windows PowerShell не позволяет использовать исключенное имя в качестве (возможно, позиционно подразумеваемого) -Destination аргумента.

Решение, которое работает в обеих версиях PowerShell:

$dest = 'filestobehere' # OMIT the ".\"
Get-Item .\* -Exclude $dest | Move-Item -Force -Destination $dest

[1] as of PowerShell 7.3.0; however, there are two relevant feature requests: GitHub issue #15159 and GitHub issue #4126.

Другие вопросы по теме