В powershell-е есть два независимых
понятия, что такое текущая дира:
одно у самого powershell-а, а другое у
.net-а
т.е. pwd выдает одно
а
[System.IO.Directory]::GetCurrentDirectory() - выдает совсем другое
Это произошло из-за того, что в powershell-е добавили provider-ов, которые умеют бегать не только по файловой системе, а и по таким вещам: как реестр, wmi и т.д.
Такая двуличность усложняет прозрачное использование .net-классов из под powershell-а, т.к. надо постоянно помнить, что у .net-а будет другая дира, чем у powershell-а.
В идеале бы хотелось, чтобы системная текущая дира ставилась на
ту же самую, что и в powershell, если это возможно, а в остальных случаях -
ставилось на какую-нибудь несуществующую диру (диру из которой нельзя
прочитать/нельзя записать).
Но разработчики powershell-а идеал такой не сделали, поэтому приходиться выкручиваться самому.
Есть два решения данной проблемы:
1. при вызове .net-ного кода устанавливать текущую диру .net-а равной текущей дире powershell-а
[Environment]::CurrentDirectory=(Get-Location -PSProvider FileSystem).ProviderPath
2. передавать только полные пути в .net-код из powershell-а
для этого есть удобная функция convert-path, но будьте внимательны! к сожалению, она работает только для файлов, которые уже есть на диске. а если файл еще только предстоит создать, то увы...
$fullpath = convert-path $filename
[System.Xml.Linq.XElement]::Load($fullpath)