Переход к рабочему столу

У меня возникли проблемы с корректной работой моего bat-файла. Я использую два жестких диска на своем компьютере, а мой рабочий стол находится на моем диске E:. Таким образом, %Userprofile%\Desktop перемещает меня на мой рабочий стол на E: , но когда он помещается в мой файл bat, он пытается создать другую папку на моем диске C: под названием Desktop. Точно такое же написание. Но я буду использовать это на другом компьютере, который может иметь или не иметь рабочий стол на диске C:. Я копирую файл в другую папку

xcopy /s "%~dp0\Folder\Folder\Folder\Folder\File.exe" "%USERPROFILE%\Desktop\WorkFiles" /Y

Это попытается создать папку с именем «Рабочий стол» и поместить в нее исполняемый файл. Летучая мышь запускается на USB, поэтому "% ~ dp0"


person meowmeow    schedule 12.08.2017    source источник
comment
На что указывает %USERPROFILE%?   -  person SomethingDark    schedule 12.08.2017
comment
@meowmeow Я предлагаю добавить обратную косую черту к целевому пути. В противном случае в еще не существующем каталоге WorkFiles xcopy запрашивает, указывает ли цель файл или каталог. Параметр /Y не препятствует этому запросу.   -  person Mofi    schedule 12.08.2017


Ответы (1)


Ваша команда xcopy имеет завершающую обратную косую черту, включенную в %~dp0, поэтому ее слишком много. Заменить:

xcopy /s /Y "%~dp0Folder\Folder\Folder\Folder\File.exe" "%USERPROFILE%\Desktop\WorkFiles\"

Если вы переместили рабочий стол из обычного положения, вам необходимо найти фактическое местоположение в реестре (или папках пользовательской оболочки PowerShell/vbscript)
Если рабочий стол не перемещен, этот пакет, тем не менее, получит правильное местоположение:

Set "Key=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
Set "Val=Desktop"
For /F "Tokens=2*" %%A in (
  'Reg Query "%Key%" /v "%Val%" 2^>Nul ^| Find "%Val%" '
) Do Set "Desktop=%%B"
Echo 'Desktop' location: %Desktop%

Лучший способ оценить рабочий стол в различных системах Windows — использовать версию eryksuns:

@Echo off
for /f "usebackq delims=" %%a in (
  `powershell -c "[environment]::GetFolderPath('Desktop')"`
) do set "desktop=%%a"
person Community    schedule 12.08.2017
comment
Технически ключ реестра Shell Folders не должен использоваться. Вы можете получить эту информацию с помощью .NET через PowerShell: for /f "usebackq delims=" %%a in (`powershell -c "[environment]::getfolderpath('desktop')"`) do @set "desktop=%%a". - person Eryk Sun; 12.08.2017
comment
@eryksun Согласен, это более официальный способ. Мой код основан на этом ответе, в первую очередь оценивающем перемещенную папку "Загрузки", для которой, похоже, не существует другого пути. - person ; 12.08.2017
comment
@LotPings Я изменил некоторые пути к папкам оболочки, начиная с Windows 95, на всех моих компьютерах с Windows. Согласно статье Microsoft TechNet о папках оболочки пользователя и Папки оболочки последний существует только для обратной совместимости для программ, разработанных для Windows NT 4.0 или ранее. Windows 2000 и все более поздние версии Windows используют User Shell Folders и автоматически обновляют Shell Folders рано или поздно при изменении строкового значения в User Shell Folders. - person Mofi; 12.08.2017
comment
@mofi Да, моя первая версия в упомянутом ответе включала папки пользовательской оболочки, но многие варианты, казалось, больше раздражали, чем помогали. Адаптация Eryksun Powershell кажется лучшим выбором для доступных папок оболочки. - person ; 12.08.2017
comment
Для меня также интересно, что Shell Folders на моем компьютере с Windows XP содержит строки Administrative Tools и CD Burning, а User Shell Folders не имеет этих двух строковых значений. Также Shell Folders содержит только строковые значения типа REG_SZ с полным путем к каждой папке, а User Shell Folders содержит строковые значения типа REG_EXPAND_SZ, содержащие %USERPROFILE% ссылки на переменные среды (кроме тех, которые я изменил). Поэтому проще использовать Shell Folders в простых пакетных файлах, потому что путь к папке уже является развернутым абсолютным путем. - person Mofi; 12.08.2017
comment
@Mofi Интересно, что [environment]::getfolderpath('nonexistent') в PowerShell будет перечислять допустимые имена папок в сообщении об ошибке. - person ; 12.08.2017
comment
Да, в самом деле. Это действительно интересно, потому что некоторые значения в реестре не указаны PowerShell в сообщении об ошибке, и их действительно нельзя запросить с помощью этого метода, например NetHood или Fonts. Ну, на самом деле это не папки пользовательской оболочки. Как написано в реестре Windows 7, рекомендуется использовать SHGetFolderPath или SHGetKnownFolderPath с KNOWNFOLDERID, как это делает PowerShell. - person Mofi; 12.08.2017