Windows PowerShell 2.0 for the absolute beginner - errors on the last project in the book
Working through Jerry Lee Ford Jr.'s Powershell 2.0 for the Absolute Beginner book. There's a lot of typographical errors in the code of the book that I've been able to work through and correct (great practice), but there's one I simply can't seem to figure out. Downloaded his stock code from the companion website, and his code is throwing the exact same error. Code is as follows:
# *************************************************************************
#
# Script Name: GameConsole.ps1 (The PowerShell Game Console)
# Version: 1.0
# Author: Jerry Lee Ford, Jr.
# Date: January 1, 2007
#
# Description: This PowerShell script provides a listing of PowerShell
# game scripts and allows the player to play any game by
# entering its menu number.
#
# *************************************************************************
# Initialization Section
$menuList = @() #Stores an array containing information about script games
$playAgain = "True" #Controls the execution of a loop that controls game
#execution
# Functions and Filters Section
#This function gets the player's permission to begin the game
function Get-Game开发者_StackOverflowListing {
$gameList = @() #Stores and array containing a list of PowerShell scripts
$i = 0 #Used to set the index value of the array when adding elements to it
Clear-Host #Clear the screen
Write-Host #Display a game console header
Write-Host " --------------------------------------------------------------"
Write-Host " Windows PowerShell Game Console" -foregroundColor darkred
Write-Host " --------------------------------------------------------------"
$location = Set-Location C:\ShellScripts\Games #Specify the location of the game scripts
#Load an array with a list of all the PowerShell scripts in the specified folder
$gameList = Get-ChildItem . *.ps1 # | ForEach-Object -process {$i++; $gameList[$i] = $_.Name }
$gameList #Return the contents of the array to the calling statement
}
#This function displays a menu listing of PowerShell games
function Write-MenuList {
param($list) #The list of games to be displayed is passed as an array
$Counter = 0 #Used to number each menu item
Write-Host ""
ForEach ($i in $list) { #Iterate for each script stored in the array
$counter++ #Increment the counter by 1
if ($counter -lt 10) { #Format the display of the first 9 scripts
Write-Host " $counter. $i" -foregroundColor blue
}
else { #Format the display of all remaining scripts
Write-Host " $counter. $i" -foregroundColor blue
}
}
Write-Host "`n --------------------------------------------------------------"
}
function End-ScriptExecution {
Clear-Host #Clear the screen
Write-Host "`n Thank you for using the Windows PowerShell Game Console"
Start-Sleep 3 #Pause the execution of the script for 3 seconds
Clear-Host #Clear the screen
}
# Main Processing Section
$response = 0 #Stores player input
#Continue playing new games until the player decides to close the game console
while ($playAgain -eq "True") {
#Call the function that generates an array containing a list of game scripts
$menuList = Get-GameListing
#Call function that converts the contents of the array into a list of menu items
Write-MenuList $menuList
#Prompt the player to pick a game to play
$response = Read-Host "`n Enter the menu number for a game or Q to quit"
#Prepare to close the game console when the user decides to quit
if ($response -eq "Q") {
$playAgain = "False" #Modify variable value in order to terminate the loop
continue #Repeat the loop
}
#Convert the player's input to a integer and then validate the player's input
if ([int]$response -lt 1) { #Anything below 1 is not a valid menu number
Clear-Host #Clear the screen
Write-Host "`n `a`aInvalid selection."
Read-Host #Pause the script until the player presses the Enter key
continue #Repeat the loop
}
if ([int]$response -gt $menuList.length) {
Clear-Host #Clear the screen
Write-Host "`n `a`aInvalid selection."
Read-Host #Pause the script until the player presses the Enter key
continue #Repeat the loop
}
Invoke-Expression $menuList[$response] #Executed the selected game script
Clear-Host #Clear the screen
}
End-ScriptExecution
The error being thrown is:
The term 'fortuneteller.ps1' is not recognized as the name of a cmdlet, functio
n, script file, or operable program. Check the spelling of the name, or if a pa
th was included, verify that the path is correct and try again.
At line:1 char:18
+ fortuneteller.ps1 <<<<
+ CategoryInfo : ObjectNotFound: (fortuneteller.ps1:String) [], C
ommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
No matter what ps script menu item I choose, I'm getting the same error. Any help would be greatly appreciated!
Modify this line:
Invoke-Expression $menuList[$response] #Executed the selected game script
to:
Invoke-Expression $menuList[$response].FullName
or my preference:
& $menuList[$response].FullName
It was failing most likely because it is trying to execute "FortuneTeller.ps1" and the working directory is either not in that dir or even if it is in that dir, PowerShell will not execute a script from the current dir without specifying the path e.g. ".\FortuneTeller.ps1". By specifying the full path via the FullName
property this problem is avoided.
精彩评论