Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 语法错误或误解powershell Do until循环_Variables_Powershell_Switch Statement_Wildcard - Fatal编程技术网

Variables 语法错误或误解powershell Do until循环

Variables 语法错误或误解powershell Do until循环,variables,powershell,switch-statement,wildcard,Variables,Powershell,Switch Statement,Wildcard,我目前正在编写一个脚本来提示用户输入,但希望继续提示用户,直到输入工作站\IP地址或用户名。这将被实现到一个更大更健壮的脚本中,但我无法让这部分工作。是我的语法错误还是我误解了逻辑,可能两者都有 D???-*是我们公司的工作站命名标准(即DOUAW-7811652) *-admin指较大脚本不支持的管理员帐户 到目前为止,代码如下所示: Function Admin{ Write-host "Admin Accounts are not supported" -ForegroundColor

我目前正在编写一个脚本来提示用户输入,但希望继续提示用户,直到输入工作站\IP地址或用户名。这将被实现到一个更大更健壮的脚本中,但我无法让这部分工作。是我的语法错误还是我误解了逻辑,可能两者都有

  • D???-*
    是我们公司的工作站命名标准(即DOUAW-7811652)
  • *-admin
    指较大脚本不支持的管理员帐户
到目前为止,代码如下所示:

Function Admin{
Write-host "Admin Accounts are not supported" -ForegroundColor Red
}

Function Workstation{
Write-Host "Workstation $name"
$workstation = $true
}

Function UserName{
Write-Host "User Name $name"
$UserName = $true
}

DO {
$Name = Read-Host "Please enter the User Name or Workstation(or IP)"

switch -Wildcard ($name){
"*-admin" {Admin}
"D????-*"{Workstation}
"*.*.*.*"{Workstation}
Default {UserName}
}

}

until ($UserName -eq "$true" -or $workstation -eq "$true")

Read-Host "Press any key to exit"
也许你的意思是:
直到($UserName-eq$true-或$workstation-eq$true)

(注意,
$true
周围没有引号)

(虽然我可能没有这样写,但我只是修复了代码,这样你就可以摆脱无限循环)

你可能想要像这样的东西

Function Workstation{
    Write-Host "Workstation $name"
    return $true
}

Function UserName{
    Write-Host "User Name $name"
    return $true
}
DO {
    $Name = Read-Host "Please enter the User Name or Workstation(or IP)"

    switch -Wildcard ($name){
    "*-admin" {Admin}
    "D????-*"{$workstation = Workstation}
    "*.*.*.*"{$workstation = Workstation}
    Default {$UserName = UserName}
    }
} until ($UserName -eq "$true" -or $workstation -eq "$true")

我只是想说,这将是一个先进功能的良好使用。定义您的参数,使其能够执行所有验证和强制要求。像这样的东西会让你非常接近你要找的东西

Function Do-Something
{
    [CmdletBinding(DefaultParameterSetName="Username")]
    param(

        [Parameter(
            Mandatory         = $true,
            HelpMessage       = "Please enter a username",
            Position          = 0,
            ParameterSetName  = "Username",
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
            )]
        [string[]]$Username,

        [Parameter(
            Mandatory         = $true,
            HelpMessage       = "Please enter a computername",
            Position          = 0,
            ParameterSetName  = "Computername",
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
            )]
        [ValidatePattern('D\w\w\w\w-|(\d+\.){3}\d+')]
        [string[]]$ComputerName

    )
    process
    {
        if($Username){Username}
        if($ComputerName){Computername}
    }
}

Show-Command Do-Something

带引号或不带引号的结果都是一样的,无休止的循环提示响应,而从不“按任意键退出”,变量$username和$workstation的作用域在函数中。您至少需要在脚本级别确定它们的作用域。在命令提示下键入:Get Help Scope在我键入时阅读Scope,感谢您提供的信息,这可能需要一点时间才能让所有人都了解。您接受的答案非常好。它使用函数returns将结果返回到Do循环中的作用域。事实上,需要明确的是,您接受的解决方案更优雅,因为它比使用脚本或全局作用域变量更解耦。顺便说一句,编写代码时缩进是您最好的朋友:)这确实对我有效,并为我提供了所需的结果,非常感谢。