2014-07-10 182 views
2

儘管$logDir變量包含值"C:\Users\DEVELO~1\AppData\Local\Temp\logs"(從文本文件中獲得),但此代碼並不像我預期的那樣運行。它返回一個字符串數組,而不是單個字符串。如何使此PowerShell函數返回一個純字符串,但不返回一個字符串數組?

$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個字符串組成的數組。

  • 爲什麼?
  • 如何讓它返回1個字符串並仍然記錄?

我認爲這與在程序和麪向對象編程語言中使用流水線隱喻與我的背景有關。幫助是非常讚賞(:

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} 

注:

  • 我從PowerGUI內運行,但是從PowerShell控制檯它有相同的結果。
  • $PSVersionTable.PSVersion返回4.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 
} 
+0

+1;公認。非常感謝。現在我需要閱讀http://stackoverflow.com/questions/8755497/which-should-i-use-write-host-write-output-or-consolewriteline/8755614#8755614並觀看視頻。 –