У меня есть сценарий 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"
}
}
@Theo, я думал, что могу использовать Exclude, так как мой исходный путь .* aka содержимое моего текущего каталога
Нет, вы устанавливаете Exclude на литеральную строку '.\filestobehere'
@Theo Я добавил ErrorAction Stop к Move-Item, и теперь он печатает «Файл используется». Однако, если я пишу «Write-Host «Файл $($_.FullName) используется», интересно, почему он не записывает имя файла?
Это потому, что в блоке Catch вы не показываете настоящую ошибку, а только свой собственный текст "File is in use".. Измените его на $_.Exception.Message. Вы читали мой первый комментарий о переключателе -Exclude? Он не будет работать с путями к файлам, только с именами файлов.
Как указано в комментариях, основная проблема с вашей попыткой заключается в том, что вы используете путь в качестве аргумента -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.
C:\Windows\*
, где подстановочный знак указывает содержимое каталога C:\Windows.