'Powershell ps1 file "is not recognized as a cmdlet, function, operable program, or script file."

I made a Powershell function just now and saved it to a ps1 file. However, when I try to execute it from within powershell, it won't run.

I've allready changed to the settings for running unsigned code by entering this command:

set-executionpolicy remotesigned

The function is this:

Function listAllPaths([string]$fromFolder, [string]$filter, [string]$printfile){
Get-ChildItem -Path $fromFolder -Include $filter -Recurse -Force -Name > $printfile
}

What it does is create a textfile in which all the path's to a certain file are listed.
I've put it directly under c:\ and named the file listAllPaths, same as the function.

When I enter the following command inside Powershell:

PS> listAllPaths.ps1 c:\ *.pdf testingPDF.txt

I get an error saying:

The term 'listAllPaths.ps1' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.

I've tried several things and I honestly don't know how to get this to work? What I expect is for a file to be created on the given path, c:\ in this example. That file having the name testingPDF.txt and the contents being the generated this.

Can someone tell me what I'm forgetting here.

And no, Google doesn't answer everything. Tried that one allready. I wouldn't come and ask it here if I hadn't allready tried the online search-engines.



Solution 1:[1]

This is a typical error across many platforms where your environment path does not include your current directory. so when you execute your script (or command or program etc), your runtime environment looks everywhere except your current/working directory.

Try

PS> .\listAllPaths.ps1 c:\ *.pdf testingPDF.txt

EDIT: After reading your comments, I'm going to suggest you try this. I haven't actually verified the logic of your PS script. I'm merely trying to get your script to execute first.

Try editing your script as below, and execute as above.

Function listAllPaths([string]$fromFolder, [string]$filter, [string]$printfile){
Get-ChildItem -Path $fromFolder -Include $filter -Recurse -Force -Name > $printfile
}

listAllPaths

Solution 2:[2]

I could be off base here, but is it that your script is defining a function, rather than executing it? Perhaps you need to "source" the script:

. .\listallpaths.ps1

... so that now your "listallpaths" function is defined.

Solution 3:[3]

If you replace "function listallpaths" with param and get rid of the surrounding {} like this..

param([string]$fromFolder, [string]$filter, [string]$printfile)
Get-ChildItem -Path $fromFolder -Include $filter -Recurse -Force -Name > $printfile

You will have a script file that you can call as required.

PS> .\listAllPaths.ps1 c:\ *.pdf testingPDF.txt

As Matt alluded to, by declaring the function, when you called the script, it would create the function and then exit. A PowerShell script is basically a function stored in a file (without the surrounding braces.. they are implied), where the function itself would be stored in memory.

Solution 4:[4]

Another reason this can happen is if you are running a couple scripts in succession, by relative path, and one of them uses cd or Set-Location to move you from where you think you are.

Example:

You start in $HOME, which is your home folder: C:\Users\YOU

Here you have the following scripts:

  • script_a.ps1
cd C:\
mkdir myfolder
  • script_b.ps1
mkdir myfolder2

and you try to run them in succession, like so:

. '.\script_a.ps1'
. '.\script_b.ps1'

You will see the error ".\script_b.ps1" is not recognized as the name of a cmdlet because there is no script_b in C:\ !

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Matt Hamilton
Solution 3 Steven Murawski
Solution 4 daevski