Разрешаването на дълъг файлов път в системния регистър и gpedit.msc не работи

Трябва да създам папка с дълъг файлов път над 250 символа, като използвам powershell cmd.

Направих следните неща,

1, В този път на системния регистър "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem", бях променил стойността за LongPathsEnabled като "1"

2, активирах дълъг файлов път в „Политика за локален компютър > Конфигурация на компютъра > Административни шаблони > Система > Файлова система > Разрешаване на дълги пътища на Win32” (gpedit.msc)

Но докато създавате папка с повече от 250 знака с помощта на power shell cmd, тя извежда грешка, както е показано по-долу

„Нов елемент: Посоченият път, име на файл или и двете са твърде дълги. Пълното име на файл трябва да е по-малко от 260 знака, а името на директорията трябва да е по-малко от 248 знака.“


person Jagan T    schedule 03.01.2020    source източник
comment
никога не съм правил това ... но се чудя дали трябва да влезете отново, за да задействате промяната? или може би рестартиране?   -  person Lee_Dailey    schedule 03.01.2020
comment
Обикновено промените в регистъра изискват рестартиране на процеса explorer.exe. Можете да направите това от диспечера на задачите. И след това от командата за изпълнение въведете explorer.exe   -  person JimShapedCoding    schedule 03.01.2020
comment
Рестартирах машината два пъти след промените в регистъра. не работи   -  person Jagan T    schedule 03.01.2020
comment
Не съм сигурен, но мисля, че трябва да използвате -LiteralPath за дълги имена на файлове. За съжаление командата New-Item няма този параметър, така че може би първо опитайте да създадете новата папка локално и след това да използвате Copy-Item -LiteralPath ..?   -  person Theo    schedule 03.01.2020


Отговори (1)


Приложете префикса \\?\ както в следния пример:

$longPart = $( 65..86 | ForEach-Object {
    [string][char]$_ * 10
} ) -join '\'
$Path = "\\?\D:\PShell\DataFiles\$longPart"
$longPart.Length, $Path.Length -join ','
New-Item -ItemType Directory -Path $Path
241,265


    Directory: \\?\D:\PShell\DataFiles\AAAAAAAAAA\BBBBBBBBBB\CCCCCCCCCC\DDDDDDD
    DDD\EEEEEEEEEE\FFFFFFFFFF\GGGGGGGGGG\HHHHHHHHHH\IIIIIIIIII\JJJJJJJJJJ\KKKKK
    KKKKK\LLLLLLLLLL\MMMMMMMMMM\NNNNNNNNNN\OOOOOOOOOO\PPPPPPPPPP\QQQQQQQQQQ\RRR
    RRRRRRR\SSSSSSSSSS\TTTTTTTTTT\UUUUUUUUUU


Mode                LastWriteTime         Length Name                          
----                -------------         ------ ----                          
d-----       03.01.2020     22:58                VVVVVVVVVV

Относно префикса \\?\< /a>:

За входно-изходен файл, префиксът "\\?\" към низ на пътя казва на API на Windows да деактивират всички анализи на низове и да изпратят низа, който го следва, направо във файловата система.

...

Тъй като изключва автоматичното разширяване на низа на пътя, префиксът "\\?\" също позволява използването на ".." и "." в имената на пътя, което може да бъде полезно, ако се опитвате да извършвате операции върху файл с тези други запазени спецификатори на относителен път като част от напълно квалифицирания път.

Имайте предвид, че не можете да използвате префикса "\\?\" с относителен път.

Работи със следния LongPathsEnabled в регистъра:

reg.exe query "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" -v long*
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
    LongPathsEnabled    REG_SZ    1
person JosefZ    schedule 03.01.2020
comment
Ако това е UNC път, ще ви трябва \\?\UNC\server\share\filename.txt - person Theo; 04.01.2020
comment
@Тео прав си. Посочено е в Ограничение за максимална дължина на пътя параграф от същия документ, свързан в моя отговор. Не съм сигурен обаче дали дългите пътища трябва да бъдат активирани тогава за сървър, клиент или и двете? Няма да ми липсват такива знания, надявам се :) - person JosefZ; 05.01.2020