Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Write-Error" (write in Powershell, used in C#) works BUT Write-Debug doesn´t work - Why?

I have written a program with C#, that creates a logfile and fills this by using log4net. This program starts powershell-scripts. The scripts use log4net, too. It works:

> C#:   
> ps.Runspace.SessionStateProxy.SetVariable("myMethod",(Action<Level,string>)myMethod);
> ps.AddCommand(System.IO.Path.Combine(pathScripts, testSkripte[i].ToString()));  
> ps.Invoke();

> Powershell:                     
> $ScriptLog.Invoke([log4net.Core.Level]::Debug, "TestFile_Debug")                     
> $ScriptLog.Invoke([log4net.Core.Level]::Warn, "TestFile_Warn") $ScriptLog         
> $ScriptLog.Invoke([log4net.Core.Level]::Error, "TestFile_Error")

Now I want add to use the standard Write-Error, Write-Debug, etc. CMDlets in my Script.
(looks like here - answer of Hinek).

Powershell:
   Write-Warning "Write-Warning"      
  AND         
   Write-Error "Write-Error"

works, but the following doesn´t work:

Write-Debug "Write-Debug"         (I don´t get an item in my logfile)   OR    
Write-Debug "Write-Debug" -debug  (for this I get an item in my logfile, but ...)

... I get an error in my logfile, too. The error looks like this:

[2010-10-22 13:10:58,097] DEBUG : Write-Debug                                     
[2010-10-22 13:10:58,113] ERROR : Cannot invoke this function because the current
                                  host does not implement it

(I think to have all namespaces.)

What the error-message means and what can I do again this?

thanks

like image 920
Rotaney Avatar asked Feb 27 '23 00:02

Rotaney


1 Answers

Here is a workaround solution: override the default command Write-Debug (which is actually not implemented) with a function:

function global:Write-Debug
(
    [string]
    $Message,
    [switch]
    $Debug
)
{
    # check both the $Debug switch and the $DebugPreference variable:
    if ($Debug -or ($DebugPreference -ne 'SilentlyContinue')) {
        # do job; in this demo just write to the console:
        [Console]::WriteLine("DEBUG: $Message")
    }
}

In C# put this code into a string and invoke it once in the same runspace where the main script will be invoked. This “profile” code installs the global function Write-Debug which is semantically the same as the original cmdlet. Then, when the main code calls Write-Debug that function is called, not the default cmdlet.

P.S. I have not tried this way, I prefer to use my own host (see my other answer). But this way should work fine in many cases (not all, perhaps).

like image 144
Roman Kuzmin Avatar answered Apr 20 '23 00:04

Roman Kuzmin