PowerShell "user32" не существует в текущем контексте, используя dllImport - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь создать ярлык для запуска скрытой команды powershell.

Я использую этот код, который я нашел в переполнении стека:

$t = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);';add-type -name win -member $t -namespace native;[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0);

Когда я выполняю его из командной строки powershell, все работает нормально. Но когда я пытаюсь выполнить его из моего ярлыка, цель которого:% windir% \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe

, я получаю сообщение об ошибке

add-type : c:\Users\xxx\AppData\Local\Temp\ruaml1si.0.cs(8) : Name 'user32' does not exist in current context
c:\Users\xxx\AppData\Local\Temp\ruaml1si.0.cs(7) :     {
c:\Users\xxx\AppData\Local\Temp\ruaml1si.0.cs(8): >>>     [DllImport(user32.dll)] public static extern bool
ShowWindow(int handle, int state);
c:\Users\xxx\AppData\Local\Temp\ruaml1si.0.cs(9) :

Если кто-то может Помоги мне, я был бы очень рад. Спасибо тебе.

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Off-topi c note : Насколько я мог проверить, кажется, что для целевой длины ярлыка существует ограничение в 260 символов (если оно создается с помощью New » Ярлык в раскрывающемся меню правой кнопкой мыши). Видимо, ваша строка превышает этот предел ...

Однако данный вопрос может быть исправлен, если вы примените соответствующие правила для экранирования внутренних (вложенных) двойных кавычек. Например:

  • echo "here $PWD" будет работать, если выполняется из открытого окна powershell, но его эквивалент:
    • powershell.exe -noexit -command "echo ""here $PWD""" как целевая строка ярлыка windows (обратите внимание, что -noexit здесь только для просмотра вывода) и
    • powershell.exe -command "echo """"here $PWD""""" в качестве команды, запускаемой из открытого cmd окна,
    • и т. Д. *
0 голосов
/ 01 мая 2020

Вам необходимо добавить EntryPoint при импорте DLL:

$t = '[DllImport("user32.dll",EntryPoint="ShowWindow")] public static extern bool ShowWindow(int handle, int state);';add-type -name win -member $t -namespace native;[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...