2010-09-19 3 views
1

Travailler à travers Jerry Lee Ford Jr. Powershell 2.0 pour le livre Absolute Beginner. Il y a beaucoup d'erreurs typographiques dans le code du livre que j'ai pu corriger et corriger (bonne pratique), mais il y en a une que je n'arrive tout simplement pas à comprendre. Téléchargé son code stock à partir du site Web compagnon, et son code lance exactement la même erreur. Code est la suivante:Windows PowerShell 2.0 pour le débutant absolu - erreurs sur le dernier projet dans le livre

# ************************************************************************* 
# 
# 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-GameListing { 

    $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 

L'erreur est d'être jeté:

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 

Peu importe quel élément de menu de script ps je choisis, je reçois la même erreur. Toute aide serait grandement appréciée!

Répondre

6

Modifier cette ligne:

Invoke-Expression $menuList[$response] #Executed the selected game script 

à:

Invoke-Expression $menuList[$response].FullName 

ou ma préférence:

& $menuList[$response].FullName 

Il échouait très probablement parce qu'il tente d'exécuter « FortuneTeller.ps1 "et le répertoire de travail n'est pas dans ce répertoire ou même s'il se trouve dans ce répertoire, PowerShell n'exécutera pas de script à partir du répertoire actuel sans spécifier le chemin, par ex. ". \ FortuneTeller.ps1". En spécifiant le chemin d'accès complet via la propriété FullName, ce problème est évité.

Questions connexes