调用函数不执行函数内部的代码

时间:2018-05-31 02:19:04

标签: function powershell

基本上,我正在尝试创建一个脚本,允许我的GPU矿工选择运行矿工的设置(选择与矿工一起使用的GPU),这是我为PowerShell脚本编写的代码:

$choice = '0'
function Get-Choice()
{
Write-Host 'Here are your choices:'
Write-Host '1. All GPUs'
Write-Host '2. GPU 0'
Write-Host '3. GPU 1'
$choice = Read-Host -Prompt 'Type the number and press enter to select what GPU(s) to mine with'
}

Get-Choice

function Set-Gpu0
{
Write-Host 'GPU 1 Chosen'
Start-Sleep -Seconds 2
miner.exe --server us-east.zec.slushpool.com --port 4444 --user ColinAndress.Colin --pass x --cuda_devices 1 --intensity 64 --eexit 3
Set-Gpu0
}

function Set-Gpu1
{
Write-Host 'GPU 0 Chosen'
Start-Sleep -Seconds 2
miner.exe --server us-east.zec.slushpool.com --port 4444 --user ColinAndress.Colin --pass x --cuda_devices 0 --intensity 64 --eexit 3
Set-Gpu1
}

function Set-All
{
Write-Host 'All GPUs Chosen'
Start-Sleep -Seconds 2
miner.exe --server us-east.zec.slushpool.com --port 4444 --user ColinAndress.Colin --pass x --cuda_devices 0 1 --intensity 64 64 --eexit 3
Set-All 
}

function Is-Invalid
{
Write-Host 'Option is invalid. Pick again'
Get-Choice
}

If(-NOT($choice-eq1-or2-or3)){Is-Invalid}
Elseif($choice-eq1){Set-All}
Elseif($choice-eq2){Set-Gpu1}
Elseif($choice-eq3){Set-Gpu0}

代码将要求用户通过输入数字来选择3个选项中的一个,并在底部解释并调用与该选项对应的函数。问题是,一旦它调用底部的函数,它就会退出脚本而不运行函数中的任何代码。以下是运行时的样子:

PS C:\Windows\System32\WindowsPowerShell\v1.0> C:\Users\Colin\Documents\.GPU Miner\0.3.4b\Slushpool Miner.ps1
Here are your choices:
1. All GPUs
2. GPU 0
3. GPU 1
Type the number and press enter to select what GPU(s) to mine with: 3

PS C:\Windows\System32\WindowsPowerShell\v1.0>

我也试过直接在" If"中运行代码。语句,它返回与上面的代码相同的结果。有人可以试着帮我理解我在这里做错了吗?我是Powershell的新手,我不太了解很多在线功能指南,因为它们非常模糊/不适合我需要它们。

2 个答案:

答案 0 :(得分:0)

至于新手,这很好,但最好是通过MS Virtual Academy或YouTube进行一些视频培训,以便在定位文本/图书参考之前查看所有内容。看,它使阅读更加简洁。那么,对于我们的视觉学习者类型。

但是,你已经复杂了。只是我们一个简单的if或case select语句。例如:

function Get-Choice()
{
    $choice = $null

    'Here are your choices (Select a number):'
    '1. All GPUs'
    '2. GPU 0'
    '3. GPU 1'

    $choice = Read-Host -Prompt 'Type the number and press enter to select what GPU(s) to mine with'
}

switch ($choice) 
    { 
        2 {
                    'GPU 1 Chosen'
                    Start-Sleep -Seconds 2
                    miner.exe --server us-east.zec.slushpool.com --port 4444 --user ColinAndress.Colin --pass x --cuda_devices 1 --intensity 64 --eexit 3
                 } 
        3 {
                    'GPU 0 Chosen'
                    Start-Sleep -Seconds 2
                    miner.exe --server us-east.zec.slushpool.com --port 4444 --user ColinAndress.Colin --pass x --cuda_devices 0 --intensity 64 --eexit 3
                 } 
        1  {
                    'All GPUs Chosen'
                    Start-Sleep -Seconds 2
                    miner.exe --server us-east.zec.slushpool.com --port 4444 --user ColinAndress.Colin --pass x --cuda_devices 0 1 --intensity 64 64 --eexit 3
                 } 
        default  {
                    Write-Warning -Message 'Option is invalid. Pick again'
                    Get-Choice
                 }
    }

此外,您的脚本中有一些我没有得到的东西。就像选择从给定选择中启动一个代码块一样只是为了调用另一个代码块。

答案 1 :(得分:0)

您的实施存在多个问题。这是一个: 你不能写

If(-NOT($choice -eq 1 -or 2-or 3)){Is-Invalid}

if(-not($choice -eq 1 -or $choice -eq 2 -or $choice -eq 3)){Is-Invalid}

它可以更简洁地写成:

if(-not($choice -in 1..3)){Is-Invalid}

我能看到的最小变化是:

[int]$choice = 0
function Get-Choice()
{
    Write-Host 'Here are your choices:'
    Write-Host '1. All GPUs'
    Write-Host '2. GPU 0'
    Write-Host '3. GPU 1'
    $choice = Read-Host -Prompt 'Type the number and press enter to select what GPU(s) to mine with'
    [int]$choice
}

function Set-Gpu0
{
    Write-Host 'GPU 1 Chosen'
    Start-Sleep -Seconds 2
    miner.exe --server us-east.zec.slushpool.com --port 4444 --user ColinAndress.Colin --pass x --cuda_devices 1 --intensity 64 --eexit 3
    Set-Gpu0
}

function Set-Gpu1
{
    Write-Host 'GPU 0 Chosen'
    Start-Sleep -Seconds 2
    miner.exe --server us-east.zec.slushpool.com --port 4444 --user     ColinAndress.Colin --pass x --cuda_devices 0 --intensity 64 --eexit 3
    Set-Gpu1
}

function Set-All
{
    Write-Host 'All GPUs Chosen'
    Start-Sleep -Seconds 2
    miner.exe --server us-east.zec.slushpool.com --port 4444 --user     ColinAndress.Colin --pass x --cuda_devices 0 1 --intensity 64 64 --eexit 3
    Set-All 
}

function Is-Invalid
{
    Write-Host 'Option is invalid. Pick again'
    Get-Choice # Not going to work
}

$choice = Get-Choice
If(-NOT($choice -in 1..3))
{
    Is-Invalid
}
Elseif($choice -eq 1)
{
    Set-All
}
Elseif($choice -eq 2)
{
    Set-Gpu1
}
Elseif($choice -eq 3)
{
    Set-Gpu0
}

然而,在无效选择之后重新选择会失败。