1

我想在 common.ps1 中实现一个“日志”库,然后使用点源来加载它。但它不像我预期的那样工作我认为在调用 SetLogConfiguratoion 后我可以获得不同的值,但该值没有改变。那么“日志”功能不起作用,因为日志路径是 $null。我是否误解了点源?

write-host $g_nodeName ==> show $null
. 'C:\Test\Common.ps1'

write-host $g_nodeName ==> show "unkown"
SetLogConfiguratoion $sqlInstance (join-path $BackupShare 'RemvoeAgent.log')
write-host $g_nodeName ==> still "unkown"
Log 'ERROR' 'Test'

Common.ps1如下

$g_logPath = $null
$g_nodeName = "Unknown"

function SetLogConfiguratoion
{
    param
    (
        [Parameter(
            Mandatory=$true,
            HelpMessage='NodeName')]
            [ValidateNotNullOrEmpty()]
        [string]$NodeName,    

       [Parameter(
            Mandatory=$true,
        HelpMessage='LogPath')]
            [ValidateNotNullOrEmpty()]
            [string]$LogPath
        )

        if($LogPath.StartsWith('Microsoft.PowerShell.Core\FileSystem::'))
        {
            $g_logPath = $LogPath;
        }
        else
        {
            $g_logPath = 'Microsoft.PowerShell.Core\FileSystem::' + $LogPath;
        }

        $g_NodeName = $NodeName;
    }
function Log
{
    param
    (    
        [Parameter(
            Mandatory=$true,
            HelpMessage='Log level')]
        [ValidateNotNullOrEmpty()]
        [ValidateSet(
            'Error',
            'Warning',
            'Info',
            'Verbose'
            )]
        [string]$level,

        [Parameter(
            Mandatory=$true,
            HelpMessage='message')]
        [ValidateNotNull()]
        [string]$message
    )

    if($g_logPath -eq $null)
    {
        return
    }

    $time = Get-Date –format ‘yyyy/MM/dd HH:mm:ss’

    $msg = "$time :: $level :: $nodeName :: $message"

    Add-content $LogPath -value $message + '\n'
}
4

1 回答 1

1

点源脚本将使其在本地范围内运行,并在那里创建函数,但您仍然在它自己的范围内调用函数。它将在该范围内设置 $g_nodename 。如果您希望所有这些都在本地范围内运行,您需要将脚本点源到本地范围以创建函数,然后在本地范围内调用函数(通过在它们前面加上'。'(注意后面的空格点 - 必须在那里)。

. SetLogConfiguratoion $sqlInstance (join-path $BackupShare 'RemvoeAgent.log')
于 2013-04-08T14:45:55.050 回答