Использование FlashWindowEx в пакетном файле CMD

У меня есть пакетный файл CMD, обработка которого занимает много времени, и я хочу предупредить пользователя о том, что требуется некоторый ввод, мигая окно CMD.

Этот пример отлично работает в PowerShell , но если я попытаюсь скомпилировать его из CMD с помощью

      powershell -c "Add-Type -TypeDefinition @\";"^
 "using System;"^
..... and so on

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

Итак, есть ли у кого-нибудь идеи относительно того, как я могу заставить это работать и заставить мое окно CMD мигать?

изменить: ответ @mklement0 привел меня в правильном направлении. СПАСИБО.

1 ответ

Передача многострочных команд PowerShell из нетривиальна и требует тщательного экранирования.

Вот минимальный пример с Add-Type: Используя код C#, он определяет класс[Foo]со статикойBar()метод, а затем вызывает его из PowerShell:

      powershell -noprofile -c Add-Type -TypeDefinition ' ^
  public class Foo { ^
    public static string Bar() { return \"hi!\"; } ^
  } ^
  '; ^
  [Foo]::Bar()
  • Обзор правил экранирования содержится в этом ответе ; здесь стоит отметить несколько вещей:

    • Здесь-строки ( @"<newline>...<newline>"@и @'<newline>...<neline>'@) нельзя использовать , поскольку они имеют строгие требования к пробелам, в частности, требуют перевода строки как сразу после открытия /, так и перед закрытием /@', тогда как продолжение строки с не приводит к появлению новой строки. Следовательно, ваш подход не будет работать (даже с посторонним;после открытия@"удаленный).

    • Использовать'...'( дословные строки (в одинарных кавычках) ), где это возможно, что упрощает экранирование.
      Обратите внимание, что обычные строковые литералы PowerShell , а не только здесь-строки, также могут занимать несколько строк , что и используется в приведенном выше решении.

    • Когда вам действительно нужно использовать, избегайте их как\"- если"встречается один или в данной внутренней строке их нечетное количество , избегайте его/последнего как\^"(так в оригинале).

      • Обратите внимание, что все, что находится снаружи\"...\"рассматривается как нецитируемыйcmd.exe, так что метасимволы, такие как&и|требуют индивидуального^- сбежать туда.
  • Вы должны уметь применять эти правила к своемуFlashWindowExОбъявление P/Invoke.

Другие вопросы по тегам