2017-01-11 5 views
2

У нас есть сервер с Windows Server 2012 R2 установлен с помощью REFS для 32К возможностей MAX_PATH, но он не работает, как ожидалось, особенно если сравнить его с ОС Windows 10.Windows Server 2012 R2 длинные пути к файлу не работают?

Если вы используете Test-Path в Powershell на Windows 10 с очень долго UNC, используя следующую закономерность:

Test-Path -Path "\\?\UNC\hostname\share\very\long\path" -PathType Container 

он возвращает истину, но если выполнить ту же команду в Windows Server 2012 R2 он будет возвращать значение False. Обе системы используют последнюю версию Powershell, и в обеих системах в реестре включена Long Paths.

Любая идея относительно того, почему это работает на Windows 10, но не на Windows Server 2012 R2?

+0

АНИ для поддержки длинных путей, что PowerShell потребности была добавлена ​​в Windows 10 (один из обновлений.) – TravisEz13

+0

@ travisez13 если это все версии unicode для API управления файлами win32 (т.е. CreateFileW), есть статьи Microsoft, в которых говорится, что работа, уже работающая с ReFS, и Windows Server 2012 R2 поддерживает магазин ReFS, почему бы не работать в 2012 R2? Направляет вызовы API вместо работы powershell в 2012 R2? – vane

+0

Прямой звонок должен работать. Например, вы должны иметь возможность P/вызывать вызов из PowerShell. Я добавил ответ с модулем, который завершает вызовы P/Invoke для вас. – TravisEz13

ответ

2

Существует обходное решение для использования PSAlphaFS для компьютеров с обновлением до 10 лет.

Поддержка длинных путей не был добавлен в PowerShell/DotNet до ОС Windows 10. Вы можете увидеть here Long Path support was added to PowerShell in Windows 10 Anniversary Update

+0

Это отвечает на мой вопрос круглым путем. Я понял, что API win32 будет работать и уже использовал это, я просто хотел знать, почему он не работает, и из вашего ответа я вижу, что .net не включил \\? \ Passthrough в unicode win32 API до .net 4.6.2, и, скорее всего, система, о которой идет речь на моем конце, использует более низкую версию, и Powershell использует эту более низкую версию. – vane

+0

Спасибо, что принял мой ответ. Это немного более подробно, чем у меня. Все звучит правильно. Я не уверен в этих деталях, но не стесняюсь редактировать мой ответ и добавлять информацию. Кроме того, в правильной версии .NET я знаю, что вам также понадобится соответствующая версия PowerShell. Я считаю, что это версия 5.0 PowerShell. – TravisEz13

+1

Да, это было ограничение в .NET, @vane. Сбой нативного пути NT, который вы предлагаете в вопросе, будет работать в любой версии NT, но только если вы вызываете функции Win32 напрямую. Обертка NT не поддерживала его до .NET 4.6.2. Если вам нужно поддерживать более старые версии, возможно, есть какая-то магия, которую вы можете сделать для P/Invoke из PowerShell. Таким образом, вы можете напрямую обращаться к API Win32, и тогда вы будете в бизнесе. –

Смежные вопросы