Другие языки программирования и технологии

как копировать файл на рабочий стол файлом .bat не зная имя пользователя?

AV
Agirosion V.666.
207
На самом деле очень интересная задача))
В Windows папка рабочего стола пользователя может быть везде.
Во-первых, она зависит от имени пользователя - у каждого пользователя в Windows свой рабочий стол.
Во-вторых, она зависит от locale в Windows (языковая версия): в американской Windows это действительно %USERPROFILE%\Desktop. А в, например, шведской Windows это %USERPROFILE%\Skrivbord. А в русской Windows это вообще папка из двух слов "%USERPROFILE%\Рабочий стол". Поверьте, в японской версии там вообще туши свет. А именно папки Desktop может и не быть вовсе, конечно, последние версии Windows приколотили костыли к этому имени, но так было не всегда.
Кроме того, есть твики, позволяющие перенести местоположение папки рабочего стола вообще куда-то отдельно в другую папку или вообще на другой диск. А еще бывают роуминговые профили. Молчу.
Начинаем думать: получить официальное месторасположение папки рабочего стола можно официальным способом, прочитав ключ в реестре.
for /F "tokens=2*" %%A IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop^|FIND/I "desktop"') DO SET Desktop=%%B
Теперь у нас в переменной %Desktop% путь до рабочего стола текущего пользователя.
Это работает на всех Windows, которые были за последние двадцать лет.
Казалось бы, путь, куда копировать, есть, команда copy from to и дело в шляпе!
Вот только проблема у нас. Этот путь в Win-кодировке, а в батниках надо указывать Oem-кодировку.
Попытка выполнить copy приведет нас к ошибке, что пути %USERPROFILE%\╨рсюўшщ ёЄюы (именно так выглядит "Рабочий стол" в oem-кодировке) не существует. И не поспоришь, ведь его действительно не существует.
Поэтому вам придется использовать костыль - программу которая перекодирует текст из win-кодировки в oem-кодировку.
Встроенных в ОС программ для перекодировки мне найти не удалось (если это не так, поделитесь со мной в комментах об этом). Поэтому вам придется скачать программу convertcp.exe с сайта https://sourceforge.net/projects/convertcp/ - она поможет нам в преобразовании кодировок. Программа бесплатная, исходный код присутствует.
После скачивания архива с сурсфоррджа распаковываете программу и кладете ее около батничка.
Проверяете ее характеристики:
Size: 33792 байта, CRC32: 976A4F90, CRC64: D84D3EF1D439BDCD, SHA256: 9612F482E5261E68712EBF8BB4BEDA5AF6EA3BFC9D926062BD602AFE88C82FEB, SHA1: CCFCEF79D7CCCD4B30DD08DA9D3A59B61B63352A
BLAKE2sp: 4B0AC330F738268C28DE18F922BF4471DB37739839C9EA41C85B5F5AAA2D1E67
Вот окончательный вариант батника, который копирует файл readme.txt на рабочий стол текущего пользователя.
@echo off
setlocal enableextensions
for /F "tokens=2*" %%A IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop^|FIND/I "desktop"') DO SET Desktop=%%B
echo %Desktop%|convertcp.exe 0 1 >tmpfile
set /p DesktopWin=<tmpfile
del tmpfile
copy readme.txt "%DesktopWin%\\" </b
А.
Артур ..
53 430
Лучший ответ
Артур .. ...окончание текста батничка:
copy readme.txt "%DesktopWin%\\" >>logfile
endlocal
pause
В качестве бонуса около батничка пишется лог-файл. Если он не нужен, то у команды copy стираете перенаправление.
Артур .. видимо длина моего ответа была более 4к.

Если кому чего не понятно, комменты есть))
Laeis 1715 Ну если в таком ключе рассматривать, то можно заметить, что в вопросе вообще речи нет про Windows (рабочий стол есть и на MacOS и на X-серверах *NIX) и тогда придется программу перерабатывать для всех ОС :)
%USERPROFILE%\Desktop