Skip to main content

Calling PS1 from VBS and gotchas with cmdletbindingattribute() - Part 2

This post is in continuation of my previous post where things got interesting while trying to execute a PS1 from a VBScript which will start/stop the website.

At the end of post there was this interesting case where we tried to stop a website which did not exist ...But we would always get a Return code of 0 ...or Success message.

Now that is bad for a Production Script as it should fail if we didn't give the correct website name.

So for this post my sample VBScript will remain almost same with only one modification.....on the website name (in Bold Red below):

Set objShell = CreateObject("WScript.Shell")
strCommand = "powershell.exe -noprofile -file C:\temp\test2.ps1 -websitename WebSiteDoesnotExist -action stop -verbose"

strError = objshell.run(strCommand,1,True)
If strError then
                        
    WScript.Echo "Failed with Exit Code" & strError & "."
else
    WScript.echo "Success"
endif 

So what could be the issue...So I tried to execute a simple PS1 first to check if it returns back the proper Exit code to the caller VBS. I used the below PS1 for testing:


Now Let's run this PS1 from the sample VBS (have to change the path of the PS1 to C:\temp\Dex1.ps1 )




Hmmm...still success which means a zero exit code is being returned.
Now let's try a very very minimal PS1 with one line (named it Dex2.ps1)



Let's give this a run:


Voila ! that works.......So I went back tried a few things and it appears if I use the cmdletbinding() attribute to make this an advanced function it doesn't work. Strange cause I tried the same thing in my Windows 7 machine and it works.

So at last below is my machine specs where I was trying this out:




At the end would just say that PowerShell sometimes behaves in an erratic way....but there is a way out, always and in the process you might learn something new :)





Popular posts from this blog

Test connectivity via a specific network interface

Recently while working on a Private cloud implementation, I came across a scenario where I needed to test connectivity of a node to the AD/DNS via multiple network adapters.  Many of us would know that having multiple network routes is usually done to take care of redundancy. So that if a network adapter goes down, one can use the other network interface to reach out to the node. In order to make it easy for everyone to follow along, below is an analogy for the above scenario: My laptop has multiple network adapters (say Wi-Fi and Ethernet) connected to the same network. Now how do I test connectivity to a Server on the network only over say Wi-Fi network adapter?

PowerShell + SCCM : Run CM cmdlets remotely

Today I saw a tweet about using implicit remoting to load the Configuration Manager on my machine by Justin Mathews . It caught my eye as I have never really tried it, but theoretically it can be done. Note - The second tweet says "Cannot find a provider with the name CMSite", resolution to which is in the Troubleshooting section at the end.

PowerShell : Trust network share to load modules & ps1

Problem Do you have a central network share, where you store all the scripts or PowerShell modules ? What happens if you try to run the script from a network share ? or if you have scripts (local) which invoke scripts or import PowerShell modules stored on this network share ? Well you would see a security warning like below (Note - I have set execution policy as 'Unrestricted' not 'bypass' here): Run a .ps1 from the network share Well this is a similar warning, which you get when you download scripts from Internet. As the message says run Unblock-File cmdlet to unblock the script and then run it, let's try it.