に$ argsを使用[OK]を、私は別のにかなり長い間コード化されてきたが、私は、関数の戻りのPowershellsの概念を得ていないのです....PowerShellの:関数から予期しない戻り値、アクセスパラメータ
?私はPowershellにとって非常に新しいので、私は何か非常に基本的なものが欠けていると確信しています。
私は、以下の機能を持っている:
function plGetKeyValue ([string] $FileName, [string] $SectionName, [string] $Key)
{
if ($PSBoundParameters.Count -lt 2 -or $PSBoundParameters.Count -gt 3 )
{
"Invalid call to {0} in {1}" -f $MyInvocation.MyCommand.Name,
$MyInvocation.MyCommand.ModuleName
return
}
# Declaration
$lFileContents = ""
$lSections = ""
$lDataStart = ""
$lStart = -1
$lEnd = -1
$lFoundSection = ""
$lNextSection = ""
$lResults = ""
$lRetValue = ""
# Handle the optional parameter.
if ($PSBoundParameters.Count -eq 2 ) {
$PSBoundParameters.Add('Key', $SectionName)
$PSBoundParameters.Remove('SectionName')
$Key = $SectionName
$SectionName = $null
}
# Read the file in
$lFileContents = Get-Content $FileName | Select-String -Pattern .*
# Get the sections.
$lSections = $lFileContents -match '\['
$lSections = $lSections -notmatch '#'
# Start of the data.
$lDataStart = $lFileContents | Select-String -Pattern "^#", "^$" -NotMatch `
| select-object -First 1
# We have a section.
if ($PSBoundParameters.ContainsKey('SectionName')) {
# Find the section.
$lFoundSection = $lSections | Select-String -Pattern "$lSectionName\b"
# If none found we are out.
if (-Not $lFoundSection) { return $lRetValue }
# Starting point for the key search is the line following
# the found section.
$lStart = $lFoundSection[0].LineNumber
# Loop through the sections and find the one after the found one.
$lNextSection = $lSections | ForEach-Object {
# If we hit it, break.
if ($_.LineNumber -gt $lStart) {
break;
}
}
# Set the ending line for the search to the end of the section
# or end of file. Which ever we have.
if ($lNextSection) {
$lEnd = $lNextSection[0].LineNumber
} else {
$lEnd = $lFileContents[-1]
}
} else {
# No section.
$lStart = $lDataStart.LineNumber
# Set the ending line for the search to the end of the section
# or end of file. Which ever we have.
if ($lSections) {
$lEnd = $lSections[0].LineNumber
} else {
$lEnd = $lFileContents[-1]
}
}
# Extract the lines starting with the key.
$lResults = $lFileContents[$lStart..$lEnd] -match "$Key\b"
# We got results.
# Split the value off.
return $lRetValue = $lResults[0] | Select -ExpandProperty "Line"
}
私が研究し
1)ドキュメントと混乱しているいくつかの質問を巻き起こしたこの機能を作成するプロセスは、$ argsを使用する必要があることを示し
議論を決定する。それは私のために設定されていないようですか?私はバージョン4を使用していますか?代わりに私は$ PSBoundParametersを使用しました。これはお勧めですか?
2)多くの読み取りとヘッドのスクラッチに基づいて、私は関数からの戻り値がすべての未キャプチャ出力をパイプラインに返すことを発見しました。誰かが、キャプチャされていない明確にしてくださいできますか?
例として、変数$ lRetValueに文字列を返す関数を以下に示します。現在、Trueを返しています。それに基づいて私は何かが捕らえられていないと信じていますか?しかし、私が実行しているものはすべて変数に取り込まれます。私は何が欠けていますか?
$FileName = "S:\PS\Home\GlobalConfig\jobs.cfg"
$key = "Help"
$section = "Section"
$r = plGetKeyValue $FileName $Key
write-host "r is: $r"
出力が示す次のように:
PS C:
呼び出すルーチンは、次の形式のコードを呼び出している> S:\ PS \ホーム\仕事\ Test.ps1 をrは:True
ご援助をいただければ幸いです。
1) '$のargs' *決して*を移入? 'function test {echo $ args};を実行するとどうなりますか?テスト "asdf" '?それは "asdf"をエコーしませんか? – TessellatingHeckler
2) '$ files = Get-ChildItem'は変数内のGet-ChildItemの戻り値を取得します。あなたがそれをしないと、 'Get-ChildItem'出力はパイプラインに行きます。それが関数内で発生すると、関数はパイプライン内の他のものと共に関数の戻り値の一部になります。 'return'キーワードは、特定の値を返す際の他の言語と同じものではありません。 – TessellatingHeckler
さらにargsを試して、何が起こるかを見てみましょう。私はそれがどのように働いたかについて、私はちょうど純粋に間違っていたと思った。しかし、助けてくれてありがとう。 –