command-linepowershellscriptingpsake

PowerShell 2.0 - Running scripts for the command line call vs. from the ISE


After writing deployment scripts from within the ISE, we need our continuous integration (CI) server to be able to run them automatically, i.e. from the command line or via a batch file.

I have noticed some significant differences between the following calls:

powershell.exe -File Script.ps1
powershell.exe -Command "& '.\Script.ps1'"
powershell.exe .\Script.ps1

Some simple examples:


When using pSake:

The variable '$script:context' cannot be retrieved because it has not been set


What are the implications of each syntax, and why they are behaving differently? I would ideally like to find a syntax that works all the time and behaves like the ISE.


Solution

  • Not an answer, just a note.

    I searched for explanation of -file parameter. Most sources say only "Execute a script file.". At http://technet.microsoft.com/en-us/library/dd315276.aspx I read

    Runs the specified script in the local scope ("dot-sourced"), so that the functions
    and variables that the script creates are available in the current session. Enter
    the script file path and any parameters.
    

    After that I tried to call this:

    powershell -command ". c:\temp\aa\script.ps1"
    powershell -file c:\temp\aa\script.ps1
    powershell -command "& c:\temp\aa\script.ps1"
    

    Note that first two stop after Get-Foo, but the last one doesn't.

    The problem I describe above is related to modules -- if you define Get-Foo inside script.ps1, all the 3 calls I described stop after call to Get-Foo.

    Just try to define it inside the script.ps1 or dotsource the file with Get-Foo and check it. There is a chance it will work :)