Использование 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.