Doskey for compound command

Doskey works in modern versions of Windows for setting aliases for single commands, e.g. doskey foo=bar.

There's a slight problem trying to use it for compound commands like doskey foo=bar & baz since this gets interpreted as (doskey foo=bar) & baz. The obvious fix would be to add explicit parentheses, doskey foo=(bar & baz) but for some reason this doesn't work, and doskey foo="bar & baz" doesn't work either.

Is there any way of doing this?


Solution 1:

Escape the ampersand.

foo=bar ^& baz

Solution 2:

Use $T to separate commands:

doskey foo=bar $T baz
doskey cpdel=copy $1 $2 $T del $1

from doskey /?:

$T     Command separator.  Allows multiple commands in a macro.

Solution 3:

to add to the previous answers, you can also do this:

mybatfile.cmd

    doskey /macrofile=aliases.txt

aliases.txt

    foo=bar & baz
    cpdel=copy $1 $2 $T del $1
    cc=echo|set /p=$*|clip

note that in the macrofile, there is no need to escape pipe/ampersand and you can define multiple aliases in one call.

Solution 4:

To (somewhat) add on to Dennis Williamson's answer, you can also escape the pipe character in order to pipe commands! For example, I wanted a command that copies stuff to the clipboard. Due to the way COPY will interpret it, you need to do a goofy looking command for it to actually copy the text you specify without it being followed by a newline.

In order to define a macro for copying to the clipboard, you can escape the pipe with ^:

doskey cc=echo^|set /p=$*^|clip

Upon execution of the command cc hey, you will now have hey copied to the clipboard!