Let’s start with running scripts from within Windows PowerShell itself.
(Which, truth be told, is probably the most common way to run Windows PowerShell
scripts.) Why do you get weird error messages when you try to run a script?
That’s easy. The security settings built into Windows PowerShell include
something called the “execution policy;” the execution policy determines how (or
if) PowerShell runs scripts. By default, PowerShell’s execution policy is set
to Restricted; that
means that scripts - including those you write yourself - won’t run.
Period.
Note. You can verify the settings for your execution
policy by typing the following at the PowerShell command prompt and then
pressing ENTER:
Get-ExecutionPolicy |
Now, admittedly, this might seem a bit severe. After all, what’s the point
of having a scripting environment if you can’t even run scripts with it? But
that’s OK. If you don’t like the default execution policy (and you probably
won’t) then just go ahead and change it. For example, suppose you want to
configure PowerShell to run - without question - any scripts that you write
yourself, but to run scripts downloaded from the Internet only if those scripts
have been signed by a trusted publisher. In that case, use this command to set
your execution policy to RemoteSigned:
Set-ExecutionPolicy RemoteSigned
Alternatively, you can set the execution policy to AllSigned (all scripts, including those you write
yourself, must be signed by a trusted publisher) or Unrestricted (all scripts will run, regardless of where they
come from and whether or not they’ve been signed).
See? No need to need to panic at all, is there?
Note. Not sure what we mean by “signing scripts?” Then
open up PowerShell, type the following, and press ENTER:
Get-Help About_Signing
Or, even better, download our Windows
PowerShell Graphical Help File and read the same topic in standard Windows
help format.
|
After you change your execution policy settings it’s possible to run scripts. However, you still might run
into problems. For example, suppose you change directories from your Windows
PowerShell home directory to C:\Scripts (something you can do by typing cd C:\Scripts). As it turns
out, the C:\Scripts folder contains a script named Test.ps1. With that in mind
you type the following and the press ENTER:
Test.ps1
And here’s the response you get:
The term 'test.ps1' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again. At line:1 char:7 + test.ps1 <<<<
We know what you’re thinking: didn’t we just change the execution policy?
Yes, we did. However, this has nothing to do with the execution policy. Instead,
it has to do with the way that PowerShell handles file paths. In general, you
need to type the complete file
path in order to run a script.
That’s true regardless of your location within the file system. It doesn’t
matter if you’re in C:\Scripts; you still need to type the following:
C:\Scripts\Test.ps1
Now, we said “in general” because there are a couple of exceptions to this
rule. For example, if the script happens to live in the current directory you
can start it up using the .\ notation, like so:
.\Test.ps1
Note. There’s no space between the .\ and the script
name.
|
And while PowerShell won’t search the current directory for scripts it will search all of the folders found in your
Windows PATH environment variable. What does that mean? That means that if the
folder C:\Scripts is in your path then you can run the script using this command:
Test.ps1
But be careful here. Suppose C:\Scripts is not in your Windows path. However, suppose the
folder D:\Archive is in the path, and that folder also contains a
script named Test.ps1. If you’re in the C:\Scripts directory and you simply
type Test.ps1 and press ENTER, guess which script will
run? You got it: PowerShell won’t run the script in C:\Scripts, but it will run the script found in D:\Archive. That’s
because D:\Archive is in your path.
Just something to keep in mind.
Note. Just for the heck of it, here’s a command that
retrieves your Windows PATH environment variable and displays it in a readable
fashion:
$a = $env:path; $a.Split(";") source: http://technet.microsoft.com/en-us/library/ee176949.aspx |
No comments:
Post a Comment