PowerShell函数调用中变量值未更新及输出顺序异常问题咨询
PowerShell代码执行问题解析
原始代码
$logDate = Get-Date $codeBlockId = "NOTHING" $addToCodeRunLog = Write-Host "However, inside addToCodeRunLog, codeBlockId is $codeBlockId. This line comes second" function addCodeBlockLogs { Write-Host "inside CodeBlockLogs, the value of codeBlockID is $codeBlockId. This line comes first." $addToCodeRunLog } function deviceInfoLog { $codeBlockId = "1002" addCodeBlockLogs } deviceInfoLog
运行结果
However, inside addToCodeRunLog, codeBlockId is NOTHING. This line comes second inside CodeBlockLogs, the value of codeBlockID is 1002. This line comes first.
问题解答
1. 为何从函数中调用$addToCodeRunLog时,$codeBlockID的值未发生改变?
你给$addToCodeRunLog赋值的方式有误:$addToCodeRunLog = Write-Host "..."这行代码在脚本启动阶段就直接执行了——此时$codeBlockId还是初始值"NOTHING",Write-Host会立刻把这行内容输出到控制台,而$addToCodeRunLog实际存储的是Write-Host的返回值(Write-Host不返回有效内容,所以是$null)。
后面在函数里调用$addToCodeRunLog,只是调用了一个空变量,根本不会重新执行Write-Host命令,自然不会用到后面修改后的$codeBlockId。
如果想让命令在调用时才执行并解析最新的变量值,需要把它存成脚本块,修改方式如下:
# 存成脚本块 $addToCodeRunLog = { Write-Host "However, inside addToCodeRunLog, codeBlockId is $codeBlockId. This line comes second" } # 调用时用&执行 function addCodeBlockLogs { Write-Host "inside CodeBlockLogs, the value of codeBlockID is $codeBlockId. This line comes first." & $addToCodeRunLog }
2. 为何$addToCodeRunLog的输出会早于前一行Write-Host语句的输出?
因为$addToCodeRunLog = Write-Host ...这行是脚本最先执行的代码之一,在任何函数调用之前就运行了,所以它的输出会先被打印出来。
后面的deviceInfoLog函数调用是在这之后才触发的,函数内部的Write-Host自然是后输出。你看到的顺序不是函数内部的执行顺序,而是脚本整体的执行顺序:先执行赋值时的Write-Host,再执行函数里的Write-Host。
内容的提问来源于stack exchange,提问作者RapidScampi
相关产品推荐
相关产品推荐

