Есть ли API, который предоставляет пути, которые ищет команда start?

Попытка объяснить это более описательно,

Операция 1:

x = [[0, 0], [0, 0]]
print(type(x)) # <class 'list'>
print(x) # [[0, 0], [0, 0]]

x[0][0] = 1
print(x) # [[1, 0], [0, 0]]

Операция 2:

y = [[0] * 2] * 2
print(type(y)) # <class 'list'>
print(y) # [[0, 0], [0, 0]]

y[0][0] = 1
print(y) # [[1, 0], [1, 0]]

Заметил, почему не изменяется первый элемент первого списка не изменил второй элемент каждого списка? Это потому, что [0] * 2 действительно представляет собой список из двух чисел, и ссылка на 0 не может быть изменена.

Если вы хотите создать копии клонов, попробуйте выполнить операцию 3:

import copy
y = [0] * 2   
print(y)   # [0, 0]

y = [y, copy.deepcopy(y)]  
print(y) # [[0, 0], [0, 0]]

y[0][0] = 1
print(y) # [[1, 0], [0, 0]]

еще один интересный способ создания копий клонов, операция 4:

import copy
y = [0] * 2
print(y) # [0, 0]

y = [copy.deepcopy(y) for num in range(1,5)]
print(y) # [[0, 0], [0, 0], [0, 0], [0, 0]]

y[0][0] = 5
print(y) # [[5, 0], [0, 0], [0, 0], [0, 0]]
3
задан aschipfl 24 March 2019 в 17:50
поделиться

2 ответа

Я помню дискуссию на эту тему либо на DosTips.com, либо здесь, на SO, но я не могу ее найти. Надеемся, что кто-нибудь сделает это, и мы сможем пометить этот вопрос как дубликат.

Мы знаем, что командные файлы будут искать текущий каталог, а затем переменную пути, чтобы найти исполняемый файл. Команда START также выполняет поиск по следующему пути реестра

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

. Таким образом, у вас есть несколько вариантов поиска исполняемого файла.

Вы можете использовать команду WHERE, которая ищет текущий каталог и каталоги в переменной PATH.

where notepad.exe

Вы также можете просто искать переменную пути с помощью команды FOR.

for %%I in (notepad.exe) do echo %%~$PATH:I

И, конечно, вы можете искать путь в реестре, как я уже упоминал выше, выполняя REG QUERY.

0
ответ дан Squashman 24 March 2019 в 17:50
поделиться

Edit2

Это может представлять интерес в отношении того, что вы делаете (в отличие от того, почему что-то работает так, как работает).

Из предыдущего ответа

Можно ли создать сокращенные имена для использования внутри cmd?

См. Doskey /?.

Вы можете сделать это doskey cddesk=cd "%userprofile%\desktop"

Затем введите cddesk.

Поместив все свои макросы в пакетный файл, вы можете выполнить автозагрузку. Конечно, вы можете сделать это и с пакетными файлами.

Из Технического справочника по реестру Windows 2000, Microsoft, 2000.

AutoRun HKCU\Software\Microsoft\Command Processor

Тип данных Диапазон Значение по умолчанию

Список команд REG_SZ Для этой записи значение по умолчанию отсутствует.

Описание

Содержит команды, которые выполняются при каждом запуске Cmd.exe.

Также смотрите этот пакетный файл https://pastebin.com/A2qLw8r3 , в котором перечислены специальные имена.

В командной строке start shell:desktop

Или в Пуск - Выполнить (Winkey + R) просто shell:desktop

Редактировать

Я просто добавлю несколько предостережений здесь.

Речь идет об открытии исполняемых файлов с помощью команды Start. Огромное количество правил применяется к неисполняемым файлам.

Не используя Start CMD предварительно обрабатывает командную строку и отправляет FQFN в CreateProcess - так что CMD ищет путь не CreateProcess.


https://docs.microsoft.com/en-us/windows/desktop/shell/launch - это документация для ShellExecute. Все заканчивается вызовом CreateProcess https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createprocessw . Кроме того, предварительная обработка CMD подробно описана здесь https://books.google.com.au/books/about/Windows_NT_Shell_Scripting.html?id=jrdQAAAAMAAJ&redir_esc=y . Также start /? предоставляет документацию для всех трех способов запуска файлов. Сводка здесь Команда для запуска .bat файла

Несколько забавных фактов. CMD, если не может распознать расширение файла, попытается выполнить его. ShellExecute будет прослушивать неизвестные файлы https://docs.microsoft.com/en-us/windows/desktop/com/filetype-key .

цитата из rojo: Спасибо за дамп ссылки. Я пытаюсь понять, как ShellExecute может спасти меня от необходимости полностью определять имена путей. Это был мой основной вопрос. «Чтобы использовать ShellExecute или ShellExecuteEx, ваше приложение должно указать объект файла или папки, который должен быть обработан в , и глагол, который определяет операцию». Это часть «указать файл или папку», о которой я спрашиваю.

Он использует 6 шагов в CreateProcess и, если ничего не получается, он использует пути к приложениям. Если глагол не указан, используется глагол по умолчанию (обычно открытый). См. Мой ответ здесь . Как мне автоматизировать симуляцию щелчка правой кнопкой мыши по файлу и выбора первой опции, используя vbscript .

Так что это пересечение 4 технологий. Совместимость с MSDos, изменения, сделанные IBM для OS / 2 и обновленные Microsoft для Windows 2000, стандартный способ запуска программ CreateProcess для Windows, а с Windows 95 мы получили функции оболочки, основанные на OLE

[1154 ] цитата из Рохо: Snap! Ты прав! В PowerShell мне удалось создать объект System.Diagnostics.Process, установить $ps.StartInfo.UseShellExecute = $true, а затем запустить «wordpad» без какого-либо расширения файла или полного пути. Установка .UseShellExecute property в $false привела к сбою выполнения. Как интересно!

0
ответ дан Noodles 24 March 2019 в 17:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: