2017-02-15 4 views
2

私はPowerShellスクリプトから起動している静的メソッドを持つDLLを持っています。Powershellから呼び出されたDLLは、Powershellのインストールディレクトリに相対的なパスを使用します。どうすれば他のものに設定できますか?

この静的メソッドは、ウェブサイトと共有されるlog4net構成を使用していくつかのタスクを実行し、結果を記録します。log4net構成はweb.configファイルに基づいており、powershellスクリプトはこのweb.configファイルを使用します:

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $webconfigpath) 

これは素晴らしい作品とlog4netのが正常にそうように見えるの構成、拾っ:

<log4net> 
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 
    <file value="App_Data/log/process.log" /> 
    <appendToFile value="true" /> 
    [..] 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 
</log4net> 

を問題は、それが相対パスApp_Dataに/ログ/プロセスを使用しようとするということです。 l ogの場合、ベースパスはC:¥Windows¥System32¥WindowsPowerShell¥v1.0¥です。

どのようにしてこの基本パスを自分が選択したパスに設定できますか?

web.configで絶対パスを使用したくないのは、このコードがさまざまなファイルシステムの設定でいくつかの異なる環境で動作する必要があるからです。

Set-Locationコマンドレットを使用しようとしましたが、これは機能しません。私も[Environment]::CurrentDirectoryを設定しようとしましたが、これも動作していないようです。私が何を変更しても、DLLコードはPowershellインストールディレクトリを作業ディレクトリとして使用します。

私のPowerShellスクリプトは次のようになります。

$webroot = "$PSScriptRoot\..\webdir"; 
$webconfig = "$webroot\web.config"; 

# Neither of these seem to set the working directory for the DLL 
#Set-Location $webroot 
#[Environment]::CurrentDirectory = $webroot 

[void][System.Reflection.Assembly]::LoadWithPartialName("System.Configuration") 
[void][System.Reflection.Assembly]::LoadFrom("$webroot\bin\Custom.Code.dll") 

if (!(Test-Path $webconfig)) { 
    Throw "Aborting, could not locate web.config at $webconfig"; 
} 

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $webconfig) 

$result = [Custom.Code.Task]::Execute() 

Write-Host $result 

にはどうすれば相対ベースとして使用するDLLのコードのパスを提供することができますか?

+0

こんにちは@ r41n、私は私のDLLを読み込んで、コードを呼び出すことができます。 Log4netの設定では、ログファイルの相対パスが使用されますが、この相対パスは実行中のスクリプトの場所ではなく、Powershellインストールディレクトリに基づいています。 – NJH

+0

申し訳ありませんが、それは完全に間違っているようです。私の無駄なコメントを削除しました。 – r41n

+0

質問を正しく理解すれば、これは予想される動作だと言えます。 DLLのコードは、呼び出し元の処理が実行されたディレクトリで実行されます。 cd(別名Set-Location)を使用しても、powershell.exeが起動したディレクトリは変更されません.dir powershellのみが動作しています。次の例の 'Start-Process行を使用してPowershellを実行し、 -FilePath powershell。exe -WorkingDirectory c:\ temp'を実行し、 "C:\ temp"を必要なディレクトリに置き換えます。その場合、スクリプトはおそらく設定ファイルを見つけることができます。 – r41n

答えて

0

異なる環境でこれを解決するために使用した方法は、環境変数を使用していました。各開発者は、どこにログを記録するかについて独自のアイデアを持っています。プロダクト環境には別の場所があります。あなたはより多くを持っている場合は

<file value="${MyLogs}App_Data/log/process.log" /> 

$env:MyLogs = "$webroot\" 
# or [Environment]::SetEnvironmentVariable("MyLogs","$webroot\") 

そして、あなたのロガーが(based on the log4net documentation)などの設定があります。

あなたの特定のケースでは、あなたPowerShellで以下の環境VARを持つことができます変数を必要とするlog4netだけでなく、環境変数を取得する独自の方法が必要です。

関連する問題