1

スクリプトは一目瞭然ですが、どのように機能させるのかわかりません。$ComputerPath変数を関数とそのスクリプトセットに渡す方法を理解したい$ComputerPath

Function CheckPath {
    While (!$args[0]) {
        Write-Host "`nVariable Undefined"
        $Args[0] = Read-Host "Enter Valid Path"
    } 
    while (!(test-path $Args[0])) {
        Write-Host "Unable To Location Files, Please Check Again."
        $args[0] = Read-Host "Enter Valid Path"
    }
}

$ComputersPath = "missingfile.txt"

$ComputersPath
CheckPath $ComputersPath
$ComputersPath

私の結果

PS Z:\Powershell Scripting\Test Lab> .\TestFunction.ps1
missingfile.txt
Unable To Location Files, Please Check Again.
Enter Valid Path: log.txt
missingfile.txt
PS Z:\Powershell Scripting\Test Lab>
4

3 に答える 3

2

変数を渡して次のように機能させてみてください。

CheckPath $ComputersPath

$一重引用符で見ると、PowerShellでは、可変修飾子ではなく、文字の「ドル記号」と見なされます。

そして、これらの行を変更します。

$args[0] = Read-Host "Enter Valid Path"
CheckPath

CheckPath (Read-Host "Enter Valid Path")

編集:

これを試して:

Function CheckPath {    
    IF (!$args[0]) {    
        Write-Host
        Write-Host "Variable Undefined"
        $args[0] = Read-Host "Enter Valid Path"
    }
    else
    {
      "Found"
      $global:ComputersPath  = $args[0]
    }

IF (!(Test-Path ($Args[0]))) {
    Write-Host
    Write-Host "Unable To Location Files, Please Check Again."
    CheckPath (Read-Host "Enter Valid Path")
}

}

編集:

関数で使用する変数を設定するために、例を示します。

function test 
{   
    $myvar = $MyInvocation.line.split(' ')[1].replace('$','')    
    "`$$myvar value now is $($args[0])"

    Invoke-Expression  "`$global:$myvar = 'yahoo'"    

    "{0} value now is {1}" -f "`$$myvar", (invoke-expression "`$$myvar")
}

あなたがこれを試すことができた後:

PS C:\ps> $a="google" #or whatever variable you want...
PS C:\ps> test $a
$a value now is google
$a value now is yahoo
PS C:\ps> $a
yahoo

これで、この関数のコードを使用してCheckPath function、目標のロジックに基づいてコードを入力できます

于 2012-10-31T09:38:58.113 に答える
1

まず、$args[0]を文字列にキャストする必要はありません。次に、$ComputersPathを一重引用符で囲んで渡します。一重引用符は変数の展開を防ぎ、値は文字通りそのまま渡されます。

これを試してみてください:

Function CheckPath {

    IF (!$args[0]) {
        Write-Host
        Write-Host "Variable Undefined"
        $args[0] = Read-Host "Enter Valid Path"
    } 

    IF (!(Test-Path $Args[0])) 
    {
        Write-Host "`nUnable To Location Files, Please Check Again."
        $args[0] = Read-Host "Enter Valid Path"
        CheckPath
    }

    $args[0]
}



CheckPath $ComputersPath

提供されたパスが存在しない場合にユーザーに無期限にプロンプ​​トを表示するためのより堅牢な方法は次のとおりです。

do{
    [string]$path = Read-Host "Enter a valid path"
} while ( -not (test-path $path) )

$path
于 2012-10-31T10:07:05.437 に答える
0

関数内でパラメーターを定義し、それを必須として宣言します。

Function CheckPath {
    param (
        [parameter(Mandatory=$true)]
        [string]$Path 
    )#End Param

    while (!(test-path $Path)) {
        Write-Host "Unable To Location Files, Please Check Again."
        $Path = Read-Host "Enter Valid Path"
    } #End While
    write-output $path
} #End Function

これにより、ユーザーはパスファイルを入力する必要がありますが、コードは見た目がすっきりします。これをテストしたところ、あなたが求めていた結果が得られました。ShayLeviのユーザーへのプロンプトの方法が好きです。彼の例を使用すると、次のようになります。

Function CheckPath {
    param (
        [parameter(Mandatory=$true)]
        [string]$Path 
    )#End Param

    do{
        [string]$path = Read-Host "Enter a valid path"
    } while ( -not (test-path $path) )
    write-output $path
}
于 2012-10-31T18:16:44.367 に答える