73
PowerShell -Command .\Foo.ps1
  • Foo.ps1:

    Function Foo($directory)
    {
        echo $directory
    }
    
    if ($args.Length -eq 0)
    {
        echo "Usage: Foo <directory>"
    }
    else
    {
        Foo($args[0])
    }
    

    Despite Foo.ps1 being in the directory from where I am calling Powershell, this results in:

    The term '.\Foo.ps1' is not recognized as the name of a cmdlet, function, script file, or operable program. 
    Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    
    • EDIT: Wasn't working because PowerShell was changing directory due to profile.ps1 containing cd C:\


I then tried to call it specifying the full path to the script file, but no matter what I try, I can't get it to work. I believe I have to quote the path because it contains whitespaces, as does the file name I need to pass in an argument to the script.

  • Best guess so far:

    PowerShell -Command "'C:\Dummy Directory 1\Foo.ps1' 'C:\Dummy Directory 2\File.txt'"
    

    Outputs error:

    Unexpected token 'C:\Dummy Directory 2\File.txt' in expression or statement. 
    At line:1 char:136.
    
JW0914
  • 177
  • 1
  • 7
Polyfun
  • 9,479
  • 4
  • 31
  • 39

6 Answers6

63

try this:

powershell "C:\Dummy Directory 1\Foo.ps1 'C:\Dummy Directory 2\File.txt'"
CB.
  • 58,865
  • 9
  • 159
  • 159
56

you are calling a script file not a command so you have to use -file eg :

powershell -executionPolicy bypass -noexit -file "c:\temp\test.ps1" "c:\test with space"

for PS V2

powershell.exe -noexit &'c:\my scripts\test.ps1'

(check bottom of this technet page http://technet.microsoft.com/en-us/library/ee176949.aspx )

Loïc MICHEL
  • 24,935
  • 9
  • 74
  • 103
  • 2
    The Windows PowerShell 1.0 Owner’s Manual has been retired. For the most up-to-date Windows PowerShell content, go to https://msdn.microsoft.com/en-au/powershell/scripting/core-powershell/console/powershell.exe-command-line-help#-file-filepath-parameters – Dave Anderson May 31 '17 at 01:28
29

Using the flag -Command you can execute your entire powershell line as if it was a command in the PowerShell prompt:

powershell -Command "& '<PATH_TO_PS1_FILE>' '<ARG_1>' '<ARG_2>' ... '<ARG_N>'"

This solved my issue with running PowerShell commands in Visual Studio Post-Build and Pre-Build events.

Tom 'Blue' Piddock
  • 2,131
  • 1
  • 21
  • 36
3

Add the param declation at the top of ps1 file

test.ps1

param(
  # Our preferred encoding
  [parameter(Mandatory=$false)]
  [ValidateSet("UTF8","Unicode","UTF7","ASCII","UTF32","BigEndianUnicode")]
  [string]$Encoding = "UTF8"
)

write ("Encoding : {0}" -f $Encoding)

result

C:\temp> .\test.ps1 -Encoding ASCII
Encoding : ASCII
Hyundong Hwang
  • 711
  • 1
  • 8
  • 19
2

Change your code to the following :

Function Foo($directory)
    {
        echo $directory
    }

    if ($args.Length -eq 0)
    {
        echo "Usage: Foo <directory>"
    }
    else
    {
        Foo([string[]]$args)
    }

And then invoke it as:

powershell -ExecutionPolicy RemoteSigned -File "c:\foo.ps1" "c:\Documents and Settings" "c:\test"

Prasoon Dwivedi
  • 119
  • 1
  • 7
0

you have type and hit enter :

PowerShell -Command

Sachin Mishra
  • 1,125
  • 1
  • 16
  • 17