powershell - Windows PowerShell 2.0(绝对入门)-书中最后一个项目的错误

标签 powershell powershell-2.0

通过Jerry Lee Ford Jr.的Powershell 2.0编写《绝对入门》一书。我已经能够解决并纠正(大量练习)这本书代码中的许多打印错误,但我似乎根本无法弄清。从同伴网站下载了他的股票代码,并且他的代码抛出了完全相同的错误。代码如下:

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

引发的错误是:
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

无论我选择什么ps脚本菜单项,都会遇到相同的错误。任何帮助将不胜感激!

最佳答案

修改此行:

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

至:
Invoke-Expression $menuList[$response].FullName

或我的偏好:
& $menuList[$response].FullName

它最有可能失败是因为它试图执行“FortuneTeller.ps1”,并且工作目录不在该目录中,即使它不在该目录中,PowerShell也不会在不指定路径的情况下从当前目录执行脚本。 “。\ FortuneTeller.ps1”。通过通过FullName属性指定完整路径,可以避免此问题。

关于powershell - Windows PowerShell 2.0(绝对入门)-书中最后一个项目的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3744455/

相关文章:

powershell - 初始化将被导出的 powershell 模块变量

Facebook 通过 PowerShell 实现自动化?

java - 使用powershell编译和运行java应用程序

c# - 在 powershell 和 C# 之间共享变量

powershell - 使用 Get-Acl 获取导致 UnauthorizedAccessException 的文件或目录的路径

java - 通过 CMD 与 Powershell 执行 Java 命令时的差异 - 由句点 ("."引起)

powershell - 在 Powershell 中替换部分文件名

excel - 使用 power shell 将 excel 工作簿数据从文件夹合并到 csv 文件

powershell - 是否可以使用 PowerTab 为别名函数配置制表符补全?

powershell - 将 PowerShell 字典复制到变量中