long file paths in bare Windows

Представьте что вам нужно удалить или создать на голой windows длинный путь. Ставить ничего нельзя. Допустим, это набор скриптов, который должен работать везде (хотя, учитывая всё сказанное, может имеет смысл уже и подложить какой-нибудь бинарничек).

Довольно быстро выясняется что ни одна имеющихся из коробки программ это сделать не позволяет. Значит, надо программировать. Среда программирования в Windows из коробки - это powershell. Засовываем UNC path в System.IO-чего-нибудь и.. получаем сообщение о недопустимых символах. Идём в гугль, читаем: http://blogs.msdn.com/b/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx . Коротко: UNC пути в .NET запрещены. Потому что безопасность.

Надо импортировать нативный win32 API. В гугле есть рецепты. После какого-то количества копипасты всё работает. Кладём результат в long.ps1 и... он не запускается. Потому что безопасность.

В тоске перечитываем что пишет powershell.exe /? и находим что можно оказывается скрипт заbase64кодировать и указать прямо в командной строке. Тогда безопасности угрозы нет и всё выполняется. Окей. Пропускаем его через base64 -, и ничего не работает. Конечно, это же "юникод", то есть надо писать в ucs-2. Пишем, и опять ничего не работает. Начинаем сравнивать вывод [System.Text.Encoding]::Unicode.GetBytes(..) и recode utf-8..ucs-2 и обнаруживаем что порядок байтов разный - в ucs-2 первый старший, а в байтах от MS - второй. Потому что уникод, новый чудный мир, долой возню с байтами. В итоге правильная команда для фильтрации: "recode utf-8..ucs-2/21-Permutation|base64 - ".

Соединяем всё вместе, запускаем:


Результат:
Как причудлив мир! Наконец я узнал, почему Microsoft переименовала "My computer" в "Computer". ("Many of the special folder names have shortened.")
оставляя в стороне красоту повершела: а чего, cscript.exe уже тогой, этогой, отменили?
вот теперь мне даже неудобно: я думал, ты ps специально для поиздеваться выбрал…