Невозможно создать пустой .txt файл на рабочем столе, используя пакетный файл на USB - PullRequest
1 голос
/ 05 июня 2019

Когда я запускаю командный файл (на USB) с этим кодом:

@echo off
cd desktop

    type nul > Test.txt

Он создает Test.txt на USB, а не на рабочем столе. Можно ли сделать файл Test.txt, созданный на рабочем столе вместо USB?

Ответы [ 3 ]

0 голосов
/ 05 июня 2019
%USERPROFILE%\Desktop\Test.txt
0 голосов
/ 05 июня 2019

Предопределенные переменные среды Windows для каждой учетной записи пользователя. Одна из предопределенных переменных среды - USERPROFILE, содержащая путь к каталогу профиля пользователя.

Каталог рабочего стола пользователя по умолчанию %USERPROFILE%\Desktop, как определено в реестре Windows под ключом HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders со значением Desktop типа REG_EXPAND_SZ.

Существует также ключ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders также со значением Desktop, но типа REG_SZ с путем к папке на рабочем столе пользователя с уже расширенной ссылкой на переменную среды.

Пользователь имеет возможность изменить путь к папке любой папки оболочки, включая папку на рабочем столе, хотя большинство путей к папке оболочки остаются такими, как определено по умолчанию.

Таким образом, безопасный способ получить путь к папке на рабочем столе пользователя:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "DesktopFolder="
for /F "skip=1 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop 2^>nul') do if /I "%%I" == "Desktop" if not "%%~K" == "" if "%%J" == "REG_SZ" (set "DesktopFolder=%%~K") else if "%%J" == "REG_EXPAND_SZ" call set "DesktopFolder=%%~K"
if not defined DesktopFolder for /F "skip=1 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop 2^>nul') do if /I "%%I" == "Desktop" if not "%%~K" == "" if "%%J" == "REG_SZ" (set "DesktopFolder=%%~K") else if "%%J" == "REG_EXPAND_SZ" call set "DesktopFolder=%%~K"
if not defined DesktopFolder set "DesktopFolder=%UserProfile%\Desktop"
echo Desktop folder is: "%DesktopFolder%"

endlocal

Переменная среды DesktopFolder сначала удаляется, если она случайно уже существует в локальной среде командного файла.

Далее по умолчанию запрашивается уже развернутое значение реестра Desktop раздела реестра Shell Folders, и если раздел реестра с этим значением реестра существует с непустой строкой, как и ожидалось, путь к папке назначается переменной среды DesktopFolder. В целях безопасности тип значения реестра также оценивается, хотя это значение реестра всегда должно иметь тип REG_SZ.

Маловероятно, что первый запрос реестра не будет успешным ни в одной Windows, включая Windows 2000, Windows XP и Windows Server 2003 и, конечно, во всех более новых версиях Windows. Но если первый запрос реестра не смог определить папку рабочего стола пользователя, выполняется еще один запрос реестра для строкового значения Desktop под ключом User Shell Folders, который по умолчанию имеет тип REG_EXPAND_SZ. В этом случае call используется для раскрытия ссылки на переменную среды уже перед тем, как назначить путь к папке для переменной среды DesktopFolder путем двойного анализа этой последней части длинной командной строки.

Последняя переменная среды DesktopFolder определяется с путем к папке по умолчанию, используя предопределенную переменную среды UserProfile для почти 100% безопасности, если оба запроса реестра неожиданно завершились неудачей.

Итак, переменная среды DesktopFolder содержит путь к папке на рабочем столе пользователя вплоть до строки с командой endlocal.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • reg /? и reg query /?
  • set /?
  • setlocal /?

Прочитайте статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul. Оператор перенаправления > должен быть экранирован с помощью символа вставки ^ в FOR командной строке, чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , которая выполняет встроенную командную строку reg в отдельном командном процессе, запущенном в фоновом режиме с %ComSpec% /c, что обычно означает C:\Windows\System32\cmd.exe /c.

0 голосов
/ 05 июня 2019

Попробуйте указать полный путь в выходной строке как:

@echo off

    type nul > path\to\desktop\Test.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...