2017-05-04 33 views
0

SSISからパラメータ化されたPSスクリプトを実行する方法について、さまざまな研究を行ってきました。パラメータ化されたスクリプトを実行する際に問題が発生しています。 SSISによるパラメータ化powershellスクリプト実行プロセスタスク(UNCあり)

Param ([string]$filepath,[string]$filename) 

$Path = $filepath 
$InputFile = (Join-Path $Path $filename) 
$Reader = New-Object System.IO.StreamReader($InputFile) 

While (($Line = $Reader.ReadLine()) -ne $null) { 
    If ($Line -match 'FILE\|([^\|]+)') { 
     $OutputFile = "$($matches[1]).txt" 
    } 
    Add-Content (Join-Path $Path $OutputFile) $Line 
} 

は、プロセス・タスクを実行するSSISで実行すると、私は次のように表現を経由して Argumentsコマンドを構築しようとしています:PSスクリプトは、私はハードコードそれが期待通りに動作するスクリプトにパラメータがあれば、次のようになり

式を評価
"-ExecutionPolicy ByPass -File " + @[User::vPSScriptLocation] + " " + @[User::vFilePath]+ " "+ @[User::vFileName] 

は以下を与える:実行されると

-ExecutionPolicy ByPass -File \\WorkDirectory\Script.ps1 \\transfer datafile.data 

、タスクは失敗します。 .ps1というは、作業ディレクトリから削除し、SSISは、次のエラーコードを示しますされます。ここで、それはいけない、それは空の文字列を取得しているよう

Error: 0xC0029151 at Execute powershell script, Execute Process Task: In Executing "C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe" "-ExecutionPolicy ByPass -File \\WorkDirectory\Script.ps1 \\transfer datafile.data" at "", The process exit code was "-196608" while the expected was "0". 

が見えますか?任意のポインタが高く評価されました。

+0

だから、あなたのプロセスは、ファイル「\\転送の\ datafile.dataを読むことになっています"?これは有効なUNCパスではありません。エラーに示されているコードを実行するとスクリプトは機能しますか?また、すべての引数を1つの文字列として渡しているように見えますが、エラーがどのように記述されているかだけかもしれません。 '-File'がUNCをサポートしているかどうかをチェックする必要があります。 [この質問](http://stackoverflow.com/questions/35729192/ssis-powershell-script-execute)は、ファイルへのUNCパスを使用しようとしたときにエラーが発生しました。 – Matt

+0

これは\\ WorkDirectory \ Script.ps1(これはUNCではありません)を読み込むことになっています。私もスピーチマークで引数を渡そうとしましたが、同じ結果を得る。 UNCでもかまいませんが、PS1ファイルを読み込み場所から削除するのは非常に奇妙な動作です。 – TJB

+0

"\\ WorkDirectory \ Script.ps1"は有効なパスではないので、実行しようとしていることがわからないと思います。それは相対的な道なんかなんてことだろうか? PowerShellが探しているWorkDirectoryというサーバーがないと確信しています。同じ問題があなたのスクリプトの中で起こるはずです。これは、私があなたが似たようなパスを構築している場所を指し示す前に指摘しようとしていたものです。 – Matt

答えて

0

OK、それは私がこの実行プロセスを使用してタスクを実行するためにUNCパスを呼び出すことができませんでした表示されたとして、私は私が作成を許可さ​​に追加参照してスクリプトタスク内これを実行することを決定したので、 PowerShellインスタンス。これは私の理想的な解決策ではありません。私は実際に.ps1ファイルを呼びたいと思っていましたが、UNCパスを使用する必要がある場合、私の唯一の解決策です。

は、私は私のDTS変数とPSスクリプトを構築し、望ましい結果を達成し、インスタンス内でそれを実行:

public void Main() 
    { 
     string filepath = Dts.Variables["User::vUNCPath"].Value.ToString(); 
     string filename = Dts.Variables["User::vFileName"].Value.ToString(); 
     string searchterm = Dts.Variables["User::vSearchTerm"].Value.ToString(); 
     bool fireAgain = true; 

     // Build powershell script 
     string script = "$Path = \""+filepath+"\";"+ 
         "$InputFile = (Join-Path $Path \""+ filename+"\");" + 
         "$Reader = New-Object System.IO.StreamReader($InputFile);" + 
         "While (($Line = $Reader.ReadLine()) -ne $null) {" + 
         "If ($Line -match '"+searchterm+"') { "+ 
         "$OutputFile = \"$($matches[1]).txt\"};" + 
         "Add-Content (Join-Path $Path $OutputFile) $Line}"; 

     Dts.Events.FireInformation(0, "Info", "Powershell script built: " + script, String.Empty, 0, ref fireAgain); 

     try 
     { 
      // Create instance to run script 
      using (PowerShell psinstance = PowerShell.Create()) 
      { 
       //Assign built script to this instance 
       psinstance.AddScript(script); 

       //Run powershell script 
       psinstance.Invoke(); 

      } 

      Dts.TaskResult = (int)ScriptResults.Success; 
     } 
     catch (Exception ex) 
     { 
      Dts.Events.FireError(0, "Error", ex.Message, String.Empty, 0); 
      Dts.TaskResult = (int)ScriptResults.Failure; 
     } 
    } 
0

あなたはこのようなのparam-ブロックでPS1-ファイルとしてスクリプトを実行している場合は、あなたの実行コールが自分の名前でパラメータに名前を付ける必要があります。

"-ExecutionPolicy ByPass -File " + @[User::vPSScriptLocation] + " -filepath " + @[User::vFilePath]+ " -filename "+ @[User::vFileName] 

これはそれを行う必要があり、あなたの場合は、有効なファイルパスとファイル名を使用してください。

動作しない場合は、スクリプトを関数として書き、powershell-consoleで試してみてください。機能としてあなたのスクリプトは次のようになります。

function SearchLines 
{ 
    Param (
    [string]$filepath, 
    [string]$filename 
) 
    $Path = $filepath 
    $InputFile = (Join-Path $Path $filename) 
    $Reader = New-Object System.IO.StreamReader($InputFile) 
    While (($Line = $Reader.ReadLine()) -ne $null) { 
    If ($Line -match 'FILE\|([^\|]+)') { 
     $OutputFile = "$($matches[1]).txt" 
    } 
    Add-Content (Join-Path $Path $OutputFile) $Line 
    } 
} 

使用法:

SearchLines -filepath "\\your\unc\path\here" -filename "filename.txt" 

これがあなたのために動作しない場合は、私たちはあなたが得たエラーお知らせください。

Thx。

UPDATE:あなたのコメントに基づいて

、私はそれが可能な限り近づけて、あなたの要件を満たし、期待して新しいあなたの関数を書きました。この関数は次のようになります。

function SearchLines 
{ 
    Param (
    [string]$InputFile 
) 
    $FileContent = Get-Content $InputFile 
    foreach($Line in $FileContent) 
    { 
    If ($Line -match 'FILE\|([^\|]+)') 
    { 
     $OutputFile = "$($matches[1]).txt" 
    }  
    Add-Content -Path $OutputFile -Value $Line 
    } 
} 

使用法:

SearchLines -InputFile c:\your\path\to\your\file.log 

この機能は、あなたの指定したファイル内のすべての行の行に書かれている名前の実際のフォルダに新しいファイルを作成します。 Cmdlet Join-Pathは、2つの文字列を単に妥当性のチェックなしで一緒に追加します。そのため、パスとファイルの代わりにファイルへのフルパスを個別のパラメータでコミットすることができます。

あなたのoutputfilesのためにそれを設定する入力ファイルのパスが必要な場合は、これらの行でそれを得ることができます:あなたは、このスクリプトが何をすべきまさに説明していなかったので

$tmpPath = Get-Childitem $InputFullPath 
$Path = $tmpPath.Directory.FullName 

、私はあなたを願っていますこれを使ってあなたが望むものを得ることができます。

挨拶

+0

最初の試みは元の質問と同じエラーを返します。コンソールで2番目に、以下のような結果が返されます。 'SearchLines'という用語は、コマンドレット、関数、scr iptファイルまたは操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスに が含まれている場合は、パスが正しいことを確認してから、もう一度やり直してください。 – TJB

+0

私の答えの完全なソースコードをコピーして、それを使用しようとする前に、powershellコンソールに貼り付けてください。スクリプトファイルで使用している場合は、param-blockの後にスクリプトファイルの先頭にコピーすることができます。 –

+0

あなたが "1"引数を持つ "例外"を呼び出す例外: "\\ your \ unc \ path \ here \ - "ファイルを見つけることができませんでした "行9 char 23 $ Reader = New- Object <<<< System.IO.StreamReader($ InputFile) – TJB

関連する問題