Редактировать 3 (РЕШЕНИЕ):
Как описано в его ответе michael_heath , проблема сводится к двум вещам: как именно Windows создает команды при выполнении чего-либочерез ярлык, и очень конкретные (и откровенно смешные) последствия включения \C
cmd.exe
.Для дальнейшего использования, если на этот вопрос StackOverflow возникнет какая-либо другая бедная душа, проблема была исправлена путем изменения свойства «Цель» в ярлыке на слегка отредактированную версию ответа Майкла, в частности C:\Windows\System32\cmd.exe /C @"C:\{path-to-script}\link.bat"
. Вот еще и скриншот, , если необходимо, хотя, к сожалению, вы не видите всю строку цели.
Огромное спасибо еще раз Майклу.
Я пытаюсьчтобы создать персональную пакетную утилиту для создания символической ссылки на рабочем столе, почти так же, как «Отправить на ...> Рабочий стол» работает с ярлыками.Я часто использую символические ссылки, чтобы такие вещи, как мои файлы конфигурации bash (.bashrc и .bash_profile и т. Д.), Контролировались версиями в других местах для переносимости и для некоторых других вещей на моем компьютере.
Для простоты использования,Моя идея состояла в том, чтобы создать простой командный файл, чтобы сделать это для меня, и поместить символическую ссылку на рабочий стол.Затем я бы поместил ярлык для этого файла в папку «Отправить», чтобы он появлялся в «Отправить» в контекстном меню (я знаю, что для mklink требуются права администратора, поэтому ярлык также должен запускаться от имени администратора).
Вот файл, который я написал:
@echo off
set f=%~1
set switch=
if exist "%f%\*" set switch=/D
for /F "delims=" %%i in ("%f%") do set name=%%~nxi
mklink %switch% "%USERPROFILE%\Desktop\%name%" "%f%"
if not %ERRORLEVEL%==0 pause
Вот общее представление о том, что я пытаюсь сделать:
- Обрезать кавычки на входе, если есть (% ~ 1)
- Проверьте, является ли ввод каталогом
- Получите базовое имя и расширение файла ввода (%% ~ nxi)
- Makeссылка
- Если произошла ошибка, сделайте паузу, чтобы ее можно было увидеть, а не закрыть (потому что пакетный файл вызывается из ярлыка)
Работает отлично, пока я ее не выдаювход, содержащий пробелы в имени файла или каталога.На самом деле я не проверял, что происходит, если в пути есть каталог с пробелом, но нет базового имени фактического файла или каталога, но я предполагаю, что та же проблема будет присутствовать.
IЯ сделал несколько изменений, чтобы попытаться заставить его работать с файлами с пробелами, включая удаление кавычек на входе в этой первой строке, чтобы кавычки не удваивались позже, и что «delims =» в цикле for.Те два решения, которые я нашел здесь, на самом деле.
Но, несмотря на все мои усилия, независимо от того, что я делаю, файл немедленно закрывается, когда вводится пробел.Я набросал каждую строку с pause
s, запускаю сценарий из командной строки с вводом вручную, чтобы он не выходил, и запускаю каждую отдельную команду (где это возможно) из командной строки.
УжасноКогда я запускаю его из командной строки или запускаю отдельные команды, все отлично работает даже с пробелами во входных данных.Я даже создал другой пакетный файл, который ничего не делает, кроме вывода ввода, который он получает, и запускает , что от Send To, и подтвердил, что ввод такой же, как я ввел из командной строки.
Что, черт возьми, идет не так, когда вызывается с этого ярлыка в Send To?
Edit 1: Свойства самого ярлыка следующие:
- Цель: C: \ Users {имя пользователя} \ vc \ git \ util-scripts \ bat \ link.bat
- Начать с: C: \ Users {имя пользователя} \ vc \ git \ util-scripts\ bat
Вот еще и скриншот:
Поскольку я только что сделал свой аккаунт, я не могу вставить изображение, но здесь оно
Редактировать 2: Это текущий код, который я использую, как предложил Герхард Барнард, однако проблема все еще сохраняется:
@echo off
set "fname=%~1"
set switch=
if exist "%fname%\.*" set "switch=/D"
for /F "delims=" %%i in ("%fname%") do (
mklink %switch% "%USERPROFILE%\Desktop\%%~nxi" "%fname%"
if errorlevel 1 pause
)