即使$logDir
变量包含值"C:\Users\DEVELO~1\AppData\Local\Temp\logs"
(从文本文件中获取),此代码的行为也不如我所期望的那样。它返回一个字符串数组,而不是单个字符串。
$LogFileName = "NoIP-update.log"
$ConfigSection = "NoIp"
function Log-Message ($MSG) {
$script:Logger += "$(get-date -format u) $MSG`n"
Write-Output $MSG
}
function Get-LogFileName ($config) {
$Local:logDir = $config["Section"]["LOGDIR"]
if ($Local:logDir -ne "") {
Log-Message "Testing for directory '$Local:logDir'"
if(!(Test-Path -Path $Local:logDir )){
New-Item -ItemType directory -Path $Local:logDir
Log-Message "Created directory '$Local:logDir'"
}
return "$Local:logDir\$LogFileName"
}
return $LogFileName
}
我可能遗漏了一些非常基本的东西,因为我希望函数返回1个字符串,而不是字符串数组并记录一行或两行。
但是,它没有记录,并且:如果$Local:logDir
存在,则该函数返回一个包含2个字符串的数组,否则返回一个包含4个字符串的数组。
我认为这与使用流水线隐喻的思维与我在程序和面向对象编程语言中的背景有关。非常感谢帮助(:
2字符串数组:
{Testing for directory 'C:\Users\DEVELO~1\AppData\Local\Temp\logs', C:\Users\DEVELO~1\AppData\Local\Temp\logs\NoIP-update.log}
4字符串数组:
{Testing for directory 'C:\Users\DEVELO~1\AppData\Local\Temp\logs', C:\Users\Developer\AppData\Local\Temp\logs, Created directory 'C:\Users\DEVELO~1\AppData\Local\Temp\logs', C:\Users\DEVELO~1\AppData\Local\Temp\logs\NoIP-update.log}
注意:
$PSVersionTable.PSVersion
返回4.0
。答案 0 :(得分:3)
问题在于Log-Message
,特别是行Write-Output
。
在函数内使用Write-Output
时,它被视为从函数返回值的一种方法(即它可以与Return
互换使用)。所以发生的事情是您的日志消息包含在Return
流中。
如果您只想在显示屏上显示记录信息,请改用Write-Host
。这将向主机显示信息,但不会包含在您的Return
信息流中。
因此,修复方法是将您的Log-Message
功能更改为:
function Log-Message ($MSG) {
$script:Logger += "$(get-date -format u) $MSG`n"
Write-Host $MSG
}