<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://powershell.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Dreaming in PowerShell : path, backtick, Alias, incompatible</title><link>http://powershell.com/cs/blogs/tobias/archive/tags/path/backtick/Alias/incompatible/default.aspx</link><description>Tags: path, backtick, Alias, incompatible</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Mastering PowerShell Incompatibilities</title><link>http://powershell.com/cs/blogs/tobias/archive/2008/11/26/mastering-powershell-incompatibilities.aspx</link><pubDate>Wed, 26 Nov 2008 04:22:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:382</guid><dc:creator>Tobias Weltner</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=382</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2008/11/26/mastering-powershell-incompatibilities.aspx#comments</comments><description>
&lt;p&gt;



&lt;/p&gt;
&lt;p&gt;PowerShell does aim to be downwards compatible to the classic shell&amp;nbsp;&lt;strong&gt;cmd.exe&lt;/strong&gt; but compatibility is poor. Today, I&amp;#39;d like to look at some of the issues that prevent classic console commands from running correctly within PowerShell and ways to work around it.&lt;/p&gt;
&lt;h3&gt;Launching Files and Programs&lt;/h3&gt;
&lt;p&gt;Many users wonder why some programs can be launched in PowerShell while others fail to start. For example, to ping a computer, you can use the good old &lt;strong&gt;ping&lt;/strong&gt; command:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;ping.exe&amp;nbsp;127.0.0.1&lt;br /&gt;&lt;br /&gt;Pinging&amp;nbsp;127.0.0.1&amp;nbsp;with&amp;nbsp;32&amp;nbsp;bytes&amp;nbsp;of&amp;nbsp;data:&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;&lt;br /&gt;Ping&amp;nbsp;statistics&amp;nbsp;for&amp;nbsp;127.0.0.1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Packets:&amp;nbsp;Sent&amp;nbsp;=&amp;nbsp;4,&amp;nbsp;Received&amp;nbsp;=&amp;nbsp;4,&amp;nbsp;Lost&amp;nbsp;=&amp;nbsp;0&amp;nbsp;(0%&amp;nbsp;loss),&lt;br /&gt;Approximate&amp;nbsp;round&amp;nbsp;trip&amp;nbsp;times&amp;nbsp;in&amp;nbsp;milli-seconds:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Minimum&amp;nbsp;=&amp;nbsp;0ms,&amp;nbsp;Maximum&amp;nbsp;=&amp;nbsp;0ms,&amp;nbsp;Average&amp;nbsp;=&amp;nbsp;0ms&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;You can also launch windows applications like &lt;strong&gt;notepad&lt;/strong&gt;:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;notepad&lt;br /&gt;PS&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;However, trying to launch Internet Explorer fails:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;iexplore.exe&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;The&amp;nbsp;term&amp;nbsp;&amp;#39;iexplore.exe&amp;#39;&amp;nbsp;is&amp;nbsp;not&amp;nbsp;recognized&amp;nbsp;as&amp;nbsp;a&amp;nbsp;cmdlet,&amp;nbsp;function,&amp;nbsp;operable&amp;nbsp;program,&amp;nbsp;or&amp;nbsp;script&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;&amp;nbsp;file.&amp;nbsp;Verify&amp;nbsp;the&amp;nbsp;term&amp;nbsp;and&amp;nbsp;try&amp;nbsp;again.&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;At&amp;nbsp;line:1&amp;nbsp;char:12&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;+&amp;nbsp;iexplore.exe&amp;nbsp;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Whenever you specify a file name, PowerShell needs to know where the file is located, so it is somewhat understandable that PowerShell cannot find &lt;strong&gt;iexplore&lt;/strong&gt;. But even when you change the current directory to the folder &lt;strong&gt;iexplore&lt;/strong&gt; is located in, you still cannot launch it:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;cd&amp;nbsp;&amp;quot;$env:programfiles\Internet&amp;nbsp;Explorer&amp;quot;&lt;br /&gt;C:\Program&amp;nbsp;Files\Internet&amp;nbsp;Explorer&lt;br /&gt;PS&amp;gt;&amp;nbsp;dir&amp;nbsp;iexplore.exe&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Program&amp;nbsp;Files\Internet&amp;nbsp;Explorer&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastWriteTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Length&amp;nbsp;Name&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;------&amp;nbsp;----&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1/18/2008&amp;nbsp;10:33&amp;nbsp;PM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;625664&amp;nbsp;iexplore.exe&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;iexplore.exe&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;The&amp;nbsp;term&amp;nbsp;&amp;#39;iexplore.exe&amp;#39;&amp;nbsp;is&amp;nbsp;not&amp;nbsp;recognized&amp;nbsp;as&amp;nbsp;a&amp;nbsp;cmdlet,&amp;nbsp;function,&amp;nbsp;operable&amp;nbsp;program,&amp;nbsp;or&amp;nbsp;script&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;&amp;nbsp;file.&amp;nbsp;Verify&amp;nbsp;the&amp;nbsp;term&amp;nbsp;and&amp;nbsp;try&amp;nbsp;again.&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;At&amp;nbsp;line:1&amp;nbsp;char:12&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;+&amp;nbsp;iexplore.exe&amp;nbsp;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;To launch it, you have to specify a complete absolute or relative path name. The following calls both work:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;.\iexplore.exe&lt;br /&gt;PS&amp;gt;&amp;nbsp;&amp;amp;&amp;nbsp;&amp;quot;$env:programfiles\Internet&amp;nbsp;Explorer\iexplore.exe&amp;quot;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;As it turns out, PowerShell keeps a list of trustworthy folders. Any file located in one of the trustworthy folders can be launched simply by entering its file name (like &lt;strong&gt;ping&lt;/strong&gt;, &lt;strong&gt;ipconfig&lt;/strong&gt; or &lt;strong&gt;notepad&lt;/strong&gt;). Any file located outside a trustworthy folder must be specified with an absolute or relative path name. Why?&lt;/p&gt;
&lt;p&gt;Security. In the past, it was easy for an attacker to trick you. The reason is the way how Windows locates files when you do not specify an absolute or relative path name: it looks in your current folder first. Here is how an attacker would exploit this vulnerability:&lt;/p&gt;
&lt;p&gt;First, the attacker smuggles a batch file into your current folder and assigns a name of a common command to it. Let&amp;#39;s create a batch file in your home folder called &lt;strong&gt;ping.bat&lt;/strong&gt;:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;cd&amp;nbsp;$home&lt;br /&gt;C:\Users\Tobias&lt;br /&gt;PS&amp;gt;&amp;nbsp;set-content&amp;nbsp;ping.bat&amp;nbsp;&amp;quot;@echo&amp;nbsp;off&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;echo&amp;nbsp;I&amp;nbsp;could&amp;nbsp;format&amp;nbsp;your&amp;nbsp;drive&amp;nbsp;now&amp;nbsp;or&amp;nbsp;do&amp;nbsp;whatever&amp;nbsp;I&amp;nbsp;want&amp;nbsp;using&amp;nbsp;your&amp;nbsp;privileges!&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;ping.exe&amp;nbsp;%1&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;echo&amp;nbsp;Note&amp;nbsp;how&amp;nbsp;the&amp;nbsp;ping&amp;nbsp;command&amp;nbsp;still&amp;nbsp;works&amp;nbsp;so&amp;nbsp;you&amp;nbsp;won&amp;#39;t&amp;nbsp;notice&amp;nbsp;the&amp;nbsp;hijacking!&amp;quot;&lt;br /&gt;&amp;gt;&amp;gt;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;When you try and ping a computer from within PowerShell, nothing bad happens because PowerShell by default will only look at files in one of the trustworthy folders so it ignores the batch file:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;ping&amp;nbsp;127.0.0.1&lt;br /&gt;&lt;br /&gt;Pinging&amp;nbsp;127.0.0.1&amp;nbsp;with&amp;nbsp;32&amp;nbsp;bytes&amp;nbsp;of&amp;nbsp;data:&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;&lt;br /&gt;Ping&amp;nbsp;statistics&amp;nbsp;for&amp;nbsp;127.0.0.1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Packets:&amp;nbsp;Sent&amp;nbsp;=&amp;nbsp;4,&amp;nbsp;Received&amp;nbsp;=&amp;nbsp;4,&amp;nbsp;Lost&amp;nbsp;=&amp;nbsp;0&amp;nbsp;(0%&amp;nbsp;loss),&lt;br /&gt;Approximate&amp;nbsp;round&amp;nbsp;trip&amp;nbsp;times&amp;nbsp;in&amp;nbsp;milli-seconds:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Minimum&amp;nbsp;=&amp;nbsp;0ms,&amp;nbsp;Maximum&amp;nbsp;=&amp;nbsp;0ms,&amp;nbsp;Average&amp;nbsp;=&amp;nbsp;0ms&lt;br /&gt;PS&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Once you switch to the old console and try the same, the attack succeeds:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;cmd.exe&lt;br /&gt;Microsoft&amp;nbsp;Windows&amp;nbsp;[Version&amp;nbsp;6.0.6001]&lt;br /&gt;Copyright&amp;nbsp;(c)&amp;nbsp;2006&amp;nbsp;Microsoft&amp;nbsp;Corporation.&amp;nbsp;&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved.&lt;br /&gt;&lt;br /&gt;C:\Users\Tobias&amp;gt;ping&amp;nbsp;127.0.0.1&lt;br /&gt;&lt;/span&gt;&lt;span class="style3"&gt;I&amp;nbsp;could&amp;nbsp;format&amp;nbsp;your&amp;nbsp;drive&amp;nbsp;now&amp;nbsp;or&amp;nbsp;do&amp;nbsp;whatever&amp;nbsp;I&amp;nbsp;want&amp;nbsp;using&amp;nbsp;your&amp;nbsp;privileges!&lt;/span&gt;&lt;span style="background-color:#012456;" class="style1"&gt;&lt;span class="style2"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;Pinging&amp;nbsp;127.0.0.1&amp;nbsp;with&amp;nbsp;32&amp;nbsp;bytes&amp;nbsp;of&amp;nbsp;data:&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;Reply&amp;nbsp;from&amp;nbsp;127.0.0.1:&amp;nbsp;bytes=32&amp;nbsp;time&amp;lt;1ms&amp;nbsp;TTL=128&lt;br /&gt;&lt;br /&gt;Ping&amp;nbsp;statistics&amp;nbsp;for&amp;nbsp;127.0.0.1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Packets:&amp;nbsp;Sent&amp;nbsp;=&amp;nbsp;4,&amp;nbsp;Received&amp;nbsp;=&amp;nbsp;4,&amp;nbsp;Lost&amp;nbsp;=&amp;nbsp;0&amp;nbsp;(0%&amp;nbsp;loss),&lt;br /&gt;Approximate&amp;nbsp;round&amp;nbsp;trip&amp;nbsp;times&amp;nbsp;in&amp;nbsp;milli-seconds:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Minimum&amp;nbsp;=&amp;nbsp;0ms,&amp;nbsp;Maximum&amp;nbsp;=&amp;nbsp;0ms,&amp;nbsp;Average&amp;nbsp;=&amp;nbsp;0ms&lt;br /&gt;&lt;/span&gt;&lt;span class="style3"&gt;Note&amp;nbsp;how&amp;nbsp;the&amp;nbsp;ping&amp;nbsp;command&amp;nbsp;still&amp;nbsp;works&amp;nbsp;so&amp;nbsp;you&amp;nbsp;won&amp;#39;t&amp;nbsp;notice&amp;nbsp;the&amp;nbsp;hijacking!&lt;/span&gt;&lt;span style="background-color:#012456;" class="style1"&gt;&lt;span class="style2"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;C:\Users\Tobias&amp;gt;exit&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;So it is actually a very well designed feature that PowerShell distinguishes between files located just anywhere and files located in safe places. Remember: files located in a safe place like the windows folder can be launched without specifying a path name because PowerShell assumes that an attacker will have a much harder time trying to smuggle malware to such a place. &lt;/p&gt;
&lt;p&gt;It is a compromise to raise the security bar yet enable you to still continue to use commands without the hassle of specifying a complete path.&lt;/p&gt;
&lt;p&gt;You can add additional folders to the &amp;quot;safe list&amp;quot;. Actually, there is no such list. PowerShell considers all folders listed in the PATH environment variable to be safe. You could easily add the Internet Explorer home folder to that environment variable and then be able to launch iexplore without a path name:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$env:path&amp;nbsp;+=&amp;nbsp;&amp;quot;;$env:programfiles\Internet&amp;nbsp;Explorer&amp;quot;&lt;br /&gt;PS&amp;gt;&amp;nbsp;iexplore&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Note that all changes to your environment variables only apply to your current PowerShell session (and all programs you launch from there). They are not persistent. Add your changes to one of your profile scripts to make persistent changes.&lt;/p&gt;
&lt;h3&gt;Alias Names&lt;/h3&gt;
&lt;p&gt;Some commands seem to work in PowerShell but once you play with them you notice they are not really compatible. While you can use the old-fashioned &lt;strong&gt;Dir&lt;/strong&gt; command to list the current folder content alright, the command does not accept the usual parameters. For example, to recursively list subfolders, the old &lt;strong&gt;/S&lt;/strong&gt; switch does not work:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;dir&amp;nbsp;/s&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;Get-ChildItem&amp;nbsp;:&amp;nbsp;Cannot&amp;nbsp;find&amp;nbsp;path&amp;nbsp;&amp;#39;C:\s&amp;#39;&amp;nbsp;because&amp;nbsp;it&amp;nbsp;does&amp;nbsp;not&amp;nbsp;exist.&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;At&amp;nbsp;line:1&amp;nbsp;char:4&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;+&amp;nbsp;dir&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;nbsp;/s&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Other commands seem to still exist but work completely different. Trying to list all environment variables using &lt;strong&gt;Set&lt;/strong&gt; fails. Instead, PowerShell starts to prompt for strange input. Press &lt;strong&gt;CTRL+C &lt;/strong&gt;to bail out.&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;Set&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ffffff;background-color:#012456;"&gt;cmdlet&amp;nbsp;Set&amp;nbsp;at&amp;nbsp;command&amp;nbsp;pipeline&amp;nbsp;position&amp;nbsp;1&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;Supply&amp;nbsp;values&amp;nbsp;for&amp;nbsp;the&amp;nbsp;following&amp;nbsp;parameters:&lt;br /&gt;Name[0]:&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Here, the reason is different. The old console uses its own set of internal commands like &lt;strong&gt;Dir&lt;/strong&gt; or &lt;strong&gt;Set&lt;/strong&gt;. Since PowerShell has its own command line processor and its own commands, many of the old internal commands no longer exist. &lt;/p&gt;
&lt;p&gt;To make transition to the new PowerShell world easier, PowerShell has a built-in alias system. &lt;strong&gt;Dir&lt;/strong&gt; is just an alias for the new internal PowerShell command (&amp;quot;Cmdlet&amp;quot;) &lt;strong&gt;Get-Childitem&lt;/strong&gt;. While Aliases can help you find and access the new commands, still the new commands work different and support different parameters or switches than the old commands. For example, to list all subfolders, in PowerShell you no longer use the &lt;strong&gt;/S&lt;/strong&gt; switch but instead the &lt;strong&gt;-recurse&lt;/strong&gt; parameter.&lt;/p&gt;
&lt;p&gt;To find out what PowerShell &amp;quot;thinks&amp;quot; when you enter a command, use &lt;strong&gt;Get-Command&lt;/strong&gt;:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;Get-Command&amp;nbsp;Dir&lt;br /&gt;&lt;br /&gt;CommandType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Definition&lt;br /&gt;-----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----------&lt;br /&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dir&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Get-ChildItem&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;Get-Command&amp;nbsp;Set&lt;br /&gt;&lt;br /&gt;CommandType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Definition&lt;br /&gt;-----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----------&lt;br /&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set-Variable&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;As it turns out, &lt;strong&gt;Set&lt;/strong&gt; is an alias pointing to the internal Cmdlet &lt;strong&gt;Set-Variable&lt;/strong&gt; and has nothing to do with the old console &lt;strong&gt;Set&lt;/strong&gt; command. This is why PowerShell prompted you for missing mandatory parameters when you entered Set.&lt;/p&gt;
&lt;p&gt;There is no other way but learn about the new internal PowerShell commands. One way is to use the Cmdlet &lt;strong&gt;Get-Help&lt;/strong&gt; which will provide you with text-based help pages: &lt;strong&gt;Get-Help Dir -detailed&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you must launch a classic command, you can also temporarily invoke the old console shell like this:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;cmd.exe&amp;nbsp;/c&amp;nbsp;set&lt;br /&gt;ALLUSERSPROFILE=C:\ProgramData&lt;br /&gt;APPDATA=C:\Users\Tobias\AppData\Roaming&lt;br /&gt;CommonProgramFiles=C:\Program&amp;nbsp;Files\Common&amp;nbsp;Files&lt;br /&gt;...&lt;br /&gt;USERDOMAIN=PCNEU01&lt;br /&gt;USERNAME=Tobias&lt;br /&gt;USERPROFILE=C:\Users\Tobias&lt;br /&gt;windir=C:\Windows&lt;br /&gt;__COMPAT_LAYER=ElevateCreateProcess&lt;br /&gt;PS&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;With a little experience, you will find PowerShell replacements for most old approaches though like this one:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;dir&amp;nbsp;env:&lt;br /&gt;&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Value&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-----&lt;br /&gt;ProgramData&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C:\ProgramData&lt;br /&gt;COMPUTERNAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PCNEU01&lt;br /&gt;...&lt;br /&gt;OS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Windows_NT&lt;br /&gt;ComSpec&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C:\Windows\system32\cmd.exe&lt;br /&gt;SystemDrive&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C:&lt;br /&gt;ALLUSERSPROFILE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C:\ProgramData&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3&gt;Special Characters&lt;/h3&gt;
&lt;p&gt;PowerShell uses a number of special characters which influence the way PowerShell interprets your input. These special characters can lead to very surprising and unexpected results like this one:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;echo&amp;nbsp;Hello&amp;nbsp;World&amp;nbsp;(and&amp;nbsp;Universe!)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;The&amp;nbsp;term&amp;nbsp;&amp;#39;and&amp;#39;&amp;nbsp;is&amp;nbsp;not&amp;nbsp;recognized&amp;nbsp;as&amp;nbsp;a&amp;nbsp;cmdlet,&amp;nbsp;function,&amp;nbsp;operable&amp;nbsp;program,&amp;nbsp;or&amp;nbsp;script&amp;nbsp;file.&amp;nbsp;Ve&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;rify&amp;nbsp;the&amp;nbsp;term&amp;nbsp;and&amp;nbsp;try&amp;nbsp;again.&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;At&amp;nbsp;line:1&amp;nbsp;char:22&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;+&amp;nbsp;echo&amp;nbsp;Hello&amp;nbsp;World&amp;nbsp;(and&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;nbsp;Universe!)&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;PowerShell uses parenthesis in pretty much the same way as you would in mathematical expressions: it evaluates the expression inside the parenthesis first and then continues with the result. &lt;/p&gt;
&lt;p&gt;In this example, thus, PowerShell tried to launch the command &amp;quot;and Universe!&amp;quot; and was unable to find a command like &amp;quot;and&amp;quot;. One thing you can do here is to use the special PowerShell escape character (the backtick) to escape the parenthesis and make sure they are interpreted as plain text:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;echo&amp;nbsp;Hello&amp;nbsp;World&amp;nbsp;`(and&amp;nbsp;Universe!`)&lt;br /&gt;Hello&lt;br /&gt;World&lt;br /&gt;(and&lt;br /&gt;Universe!)&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;You no longer receive an error message. The result is not exactly what you expected though because PowerShell still interprets a special character: the space is used as delimiter and causes the result to be separated in multiple lines. While it is perfectly possible to escape spaces also, the result looks a bit ridiculous:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;echo&amp;nbsp;Hello`&amp;nbsp;World`&amp;nbsp;`(and`&amp;nbsp;Universe!`)&lt;br /&gt;Hello&amp;nbsp;World&amp;nbsp;(and&amp;nbsp;Universe!)&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;In fact, you should not try too hard to make old commands backwards compatible but instead transition to PowerShell. Outputting a string is as simple as writing it to the console, no echo required:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;&amp;#39;Hello&amp;nbsp;World&amp;nbsp;(and&amp;nbsp;Universe!)&amp;#39;&lt;br /&gt;Hello&amp;nbsp;World&amp;nbsp;(and&amp;nbsp;Universe!)&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Not always can you do that, though. Take a look at the next command which uses the good old &lt;strong&gt;find.exe&lt;/strong&gt; utility. &lt;/p&gt;
&lt;p&gt;In the old console, it does a good job finding all files that contain a certain word. The following command looks at all ps1-Scripts in your current folder and identifies those that contain the word &amp;#39;Get-Process&amp;#39;. However, the call fails in PowerShell:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;find.exe&amp;nbsp;*.ps1&amp;nbsp;&amp;#39;Get-Process&amp;#39;&lt;br /&gt;FIND:&amp;nbsp;Parameter&amp;nbsp;format&amp;nbsp;not&amp;nbsp;correct&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;This time, the cause is less obvious. Find.exe expects both arguments to be separated by a space. Since PowerShell interprets the space as separator also, it is removed from the arguments, and Find.exe receives the arguments without the separator. &lt;/p&gt;
&lt;p&gt;There are two workarounds that illustrate the problem. You could either add an escaped space, or you could add a space to the second parameter:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;find.exe&amp;nbsp;*.ps1&amp;nbsp;`&amp;nbsp;&amp;#39;Get-Process&amp;#39;&lt;br /&gt;&lt;br /&gt;----------&amp;nbsp;AKKUCHECK.PS1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----------&amp;nbsp;WMIEVENTLOGDATE.PS1&lt;br /&gt;PS&amp;gt;&amp;nbsp;find.exe&amp;nbsp;*.ps1&amp;nbsp;&amp;#39;&amp;nbsp;Get-Process&amp;#39;&lt;br /&gt;&lt;br /&gt;----------&amp;nbsp;AKKUCHECK.PS1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----------&amp;nbsp;WMIEVENTLOGDATE.PS1&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;To dig a bit deeper into this kind of problems, you could create a little test function which dumps the arguments an external application receives from PowerShell. Here is the function:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="keyword"&gt;function&lt;/span&gt; CheckArgs {&lt;br /&gt;  &lt;span class="var"&gt;$Args&lt;/span&gt; | &lt;span class="op"&gt;%&lt;/span&gt; {&lt;span class="var"&gt;$c&lt;/span&gt;&lt;span class="op"&gt;=&lt;/span&gt;0} {&lt;span class="var"&gt;$c&lt;/span&gt;&lt;span class="op"&gt;++&lt;/span&gt;; &lt;span class="string"&gt;&amp;quot;Argument $c : &amp;#39;$_&amp;#39;&amp;quot;&lt;/span&gt;}&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Simply call &lt;strong&gt;CheckArgs&lt;/strong&gt; and provide the arguments you would normally want to provide to an external tool. Immediately, you see how your input was processed by PowerShell and what the external tool really receives:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;CheckArgs&amp;nbsp;*.ps1&amp;nbsp;&amp;#39;Get-Process&amp;#39;&lt;br /&gt;Argument&amp;nbsp;1&amp;nbsp;:&amp;nbsp;&amp;#39;*.ps1&amp;#39;&lt;br /&gt;Argument&amp;nbsp;2&amp;nbsp;:&amp;nbsp;&amp;#39;Get-Process&amp;#39;&lt;br /&gt;PS&amp;gt;&amp;nbsp;CheckArgs&amp;nbsp;*.ps1&amp;nbsp;`&amp;nbsp;&amp;#39;Get-Process&amp;#39;&lt;br /&gt;Argument&amp;nbsp;1&amp;nbsp;:&amp;nbsp;&amp;#39;*.ps1&amp;#39;&lt;br /&gt;Argument&amp;nbsp;2&amp;nbsp;:&amp;nbsp;&amp;#39;&amp;nbsp;Get-Process&amp;#39;&lt;br /&gt;PS&amp;gt;&amp;nbsp;CheckArgs&amp;nbsp;*.ps1&amp;nbsp;&amp;#39;&amp;nbsp;Get-Process&amp;#39;&lt;br /&gt;Argument&amp;nbsp;1&amp;nbsp;:&amp;nbsp;&amp;#39;*.ps1&amp;#39;&lt;br /&gt;Argument&amp;nbsp;2&amp;nbsp;:&amp;nbsp;&amp;#39;&amp;nbsp;Get-Process&amp;#39;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3&gt;Ambiguous Commands&lt;/h3&gt;
&lt;p&gt;Finally, you may run&amp;nbsp; into compatibility issues because of ambiguous commands. PowerShell can run a number of different command types like Cmdlets, Aliases, Functions, external Applications and files. &lt;/p&gt;
&lt;p&gt;Whenever you launch a command, there may be more than one command with that name. For example, when you ping a computer you may be surprised that the ping result looks different from what you are used to. Maybe you have installed a PowerShell extension like PSCX which comes with its own ping command.&lt;/p&gt;
&lt;p&gt;To find out whether there are any ambiguities, use &lt;strong&gt;Get-Command&lt;/strong&gt;:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:14;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;Get-Command&amp;nbsp;ping&lt;br /&gt;&lt;br /&gt;CommandType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Definition&lt;br /&gt;-----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----------&lt;br /&gt;Alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ping&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Ping-Host&lt;br /&gt;Application&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PING.EXE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C:\Windows\system32\PING.EXE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;In this example, there is a ping.exe external application and also a ping alias. Since aliases have precedence over applications, PowerShell picks the alias which points to a Ping-Host cmdlet installed by the PSCX extension.&lt;/p&gt;
&lt;p&gt;To avoid these ambiguities, make sure to be more specific. To explicitly run &lt;strong&gt;ping.exe&lt;/strong&gt;, call it &lt;strong&gt;ping.exe&lt;/strong&gt; and not just &lt;strong&gt;ping&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;I am sure there are tons of additional compatibility issues. If you run into something not covered here, please add a comment so we can include it in this list.&lt;/p&gt;
&lt;p&gt;May the PowerShell be with you,&lt;/p&gt;
&lt;p&gt;-Tobias&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=382" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Dir/default.aspx">Dir</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/incompatible/default.aspx">incompatible</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/backtick/default.aspx">backtick</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Set/default.aspx">Set</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/ping/default.aspx">ping</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/environment+variable/default.aspx">environment variable</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/path/default.aspx">path</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/cmd.exe/default.aspx">cmd.exe</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Alias/default.aspx">Alias</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/escape/default.aspx">escape</category></item></channel></rss>