
Короткие имена в NTFS — это функция совместимости для систем DOS, которые поддерживают только имена файлов 8.3 (<имя из 8 символов>.<расширение из 3 символов>). Мы можем получить короткие имена файлов/папок в текущем каталоге с помощью dir /x
.
"C:\Program Files" имеет короткое имя "PROGRA~1". Как назвать папку, чтобы она стала "PROGRA~1", а "C:\Program Files" стала "PROGRA~2"?
Я пробовал "Program Filas", "Program Fil", "Program File" безрезультатно. Я также пробовал устанавливать время создания, изменения, последней записи на что-то более старое с помощью:
$(Get-Item "Program Filas").creationtime=$(Get-Date "01/01/2000 00:01 am")
$(Get-Item "Program Filas").lastaccesstime=$(Get-Date "01/01/2000 00:01 am")
$(Get-Item "Program Filas").lastwritetime=$(Get-Date "01/01/2000 00:01 am")
решение1
Он никогда не станет PROGRA~1
таковым, пока у вас уже есть другой каталог с таким именем.
Короткие именанастойчивый– они выбираются при создании объекта и хранятся в файловой системе, как и обычные имена. После того, как имя назначено, ни алфавитный порядок, ни временные метки изменений не приведут к его изменению. (В конце концов, они должныработа(как и обычные имена, в том числе и то, что имя не может внезапно измениться само по себе.)
Win32 API имеет функциюSetFileShortName()что позволяет вам напрямую изменять имена 8.3 любого пути, поэтому напишите короткую программу (или используйте Python ctypes и т. д.) для выполнения этого изменения.
(Изменив короткое имя «Program Files» на что-то другое, вы можете создать каталог, названный буквально, PROGRA~1
если это необходимо программе. Вам не нужно придумывать специальное имя, чтобы обмануть алгоритм.)
В качестве альтернативы вы можете переименовать "Program Files" в "asdf", освободив его короткое имя. Затем, как только "PROGRA~1" будет захвачен вашим каталогом, переименуйте настоящий обратно в "Program Files", и ему будет назначено ~2.