I have a CMD batch file which takes a long time to process and I wish to alert the user that some input is required by flashing the CMD window.
This example works great in powershell but if I try to compile it from within CMD by
powershell -c "Add-Type -TypeDefinition @\";"^
"using System;"^
..... and so on
it fails at the very first line. Similar problem discussed here but looks like there was never a solution given.
So, does anyone have ideas as to how I can make this work and get my CMD window to flash?
edit: @mklement0's answer got me in the right direction. THANK YOU.
Passing multiline PowerShell commands from
cmd.exeis nontrivial and requires lots of careful escaping.Here's a minimal example with
Add-Type: Using C# code, it defines class[Foo]with a staticBar()method and then calls it from PowerShell:An overview of the escaping rules is in this answer; a few things worth noting here:
Here-strings (
@"<newline>...<newline>"@and@'<newline>...<neline>'@) cannot be used, because they have strict whitespace requirements, notably requiring a newline both immediately after the opening@"/@'as well as before the closing@"/@', whereascmd.exe's line-continuation with^does not result in newlines. Therefore, your approach won't work (even with the extraneous;after the opening@"removed).Use
'...'(verbatim (single-quoted) strings), where possible, which simplifies escaping.Note that PowerShell's regular string literals, not just here-strings, are also capable of spanning multiple lines, which the solution above takes advantage of.
When you do need to use
", escape them as\"- if a"occurs alone or there is an uneven number of them on a given interior line, escape it / the last one as\^"(sic).\"...\"is seen as unquoted bycmd.exe, so that metacharacters such as&and|require individual^-escaping there.You should be able to apply these rules to your
FlashWindowExP/Invoke declaration.