私は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のコードのパスを提供することができますか?
こんにちは@ r41n、私は私のDLLを読み込んで、コードを呼び出すことができます。 Log4netの設定では、ログファイルの相対パスが使用されますが、この相対パスは実行中のスクリプトの場所ではなく、Powershellインストールディレクトリに基づいています。 – NJH
申し訳ありませんが、それは完全に間違っているようです。私の無駄なコメントを削除しました。 – r41n
質問を正しく理解すれば、これは予想される動作だと言えます。 DLLのコードは、呼び出し元の処理が実行されたディレクトリで実行されます。 cd(別名Set-Location)を使用しても、powershell.exeが起動したディレクトリは変更されません.dir powershellのみが動作しています。次の例の 'Start-Process行を使用してPowershellを実行し、 -FilePath powershell。exe -WorkingDirectory c:\ temp'を実行し、 "C:\ temp"を必要なディレクトリに置き換えます。その場合、スクリプトはおそらく設定ファイルを見つけることができます。 – r41n