![运行 If 语句后 PowerShell 脚本停止](https://linux22.com/image/1520572/%E8%BF%90%E8%A1%8C%20If%20%E8%AF%AD%E5%8F%A5%E5%90%8E%20PowerShell%20%E8%84%9A%E6%9C%AC%E5%81%9C%E6%AD%A2.png)
我被难住了。我在开发时在 2012 R2 机器上运行了下面的代码。这部分代码所做的就是获取主机名,从末尾抓取数字,运行一个函数来查看它是奇数还是偶数,然后根据该数字设置存储位置。
由于某种原因,在 If 语句返回值后,脚本就停止运行,就像脚本已经结束一样。正如您所见,我添加了 write-debug“消息 3”,但它根本没有注册。有人知道这种情况下的 PS 陷阱吗?或者是我在某个地方犯了错误。服务器正在运行 WMF 4.0。
function check-oddOrEven($number)
{
If([bool]!($number%2))
{
$OddEvnResult = "Even"
return $OddEvnResult
}
Else
{
$OddEvnResult = "Odd"
return $OddEvnResult
}
}
Write-Debug "message1" -debug
$oddStrgPath = "C:\ClusterStorage\Volume1"
$evnStrgPath = "C:\ClusterStorage\Volume2"
$hostname = $env:computername
#$hostname = "testN02"
$OddEvnSplit = $hostname.split('N')[1]
Write-Debug "message2" -debug
$OddEvnResult = check-oddOrEven $OddEvnSplit
if ($OddEvnResult -eq "Odd")
{
write-host "Odd number in hostname detected (1,3,5..etc). Setting storage path to" $oddStrgPath
#set-vmhost -VirtualHardDiskPath $oddStrgPath -VirtualMachinePath $oddStrgPath
$OEresult= $oddStrgPath
return $OEresult
}
else
{
write-host "Even number in hostname detected (2,4,6..etc). Setting storage path to" $evnStrgPath
#set-vmhost -VirtualHardDiskPath $evnStrgPath -VirtualMachinePath $oddStrgPath
$OEresult= $evnStrgPath
return $OEresult
}
Write-Debug "message3" -debug
我尝试过 write-host 和 write-output,但都没有成功。以下是控制台的输出:
DEBUG: message1
DEBUG: message2
Even number in hostname detected (1,3,5..etc). Setting storage path to C:\ClusterStorage\Volume2
C:\ClusterStorage\Volume2
答案1
请阅读这篇来自 StackOverflow 的帖子关于“return”语句。摘要如下:
返回: 这会返回上一个调用点。如果您从脚本(任何函数之外)调用此命令,它将返回到 shell。如果您从 shell 调用此命令,它将返回到 shell(这是从 shell 运行的单个命令的上一个调用点)。如果您从函数调用此命令,它将返回到调用该函数的位置。
返回到调用点之后的任何命令的执行都将从该点继续。如果从 shell 调用脚本,并且该脚本在任何函数之外包含 Return 命令,那么当它返回到 shell 时,将不再运行任何命令,因此以这种方式使用的 Return 本质上与 Exit 相同。
所以,您必须从“if”和“else”中删除返回语句,只留下变量显示其内容。
例如:
if ($OddEvnResult -eq "Odd")
{
write-host "Odd number in hostname detected (1,3,5..etc). Setting storage path to" $oddStrgPath
#set-vmhost -VirtualHardDiskPath $oddStrgPath -VirtualMachinePath $oddStrgPath
$OEresult= $oddStrgPath
$OEresult
}
else
{
write-host "Even number in hostname detected (2,4,6..etc). Setting storage path to" $evnStrgPath
#set-vmhost -VirtualHardDiskPath $evnStrgPath -VirtualMachinePath $oddStrgPath
$OEresult= $evnStrgPath
$OEresult
}