2010-11-12 75 views
1

我正在寫一個相當長的PowerShell腳本來執行很多功能。大多數情況下,一切都很順利。PowerShell - 輸出到一個不起作用的變量

但是,我在腳本的各個級別運行的另一個函數是一個非常詳細的日誌。我會後命令行部爲例(簡化):

$Batch = $RunMe[1] 
    $ResultCode = (Invoke-Expression $Batch -ErrorAction Stop) 
    $ResultCode 

我的預期的結果是:

Return Code 0

然後我將記錄它。相反,我得到這樣的:

C:\batchfiles\batchfile.bat argument

這是我使用Invoke-Expression要執行的命令。

變量的一些簡單說明:

$RunMe是存儲命令(0要麼「批量」或「過程」和1是要運行的指令)

$Batch是一個數組(這是第一次引用它)

$CurrFileToExec是當前正在處理的文件(該腳本一次在文件夾上運行)。我使用它來替換從SQL獲得的命令行的字符串。我不能得到$ResultCode傳遞命令的正確輸出。它只是再次傳遞命令行函數($Batch)。

正如我所說的,實際的功能部分工作得很好,但我不能得到我的日誌文件的返回碼。

+0

如果您可以將更小,更簡單的腳本與當前和預期的結果進行比較,我認爲您會得到更好的回覆。這個問題充滿了實現細節(特定於你的工作的東西),這使得它很難理解 - 即SQL與你的問題無關。 – x0n 2010-11-12 18:28:34

+0

@ x0n - 好點,我已經削減了這個問題。 – JNK 2010-11-12 18:38:16

回答

5

如果我可以推定$ batch包含外部可執行文件,則返回代碼將位於自動變量$ LASTEXITCODE中 - invoke-expression的返回值由外部應用程序寫入STDOUT和STDERR的內容或寫入PowerShell輸出或錯誤流的內容組成通過腳本。如果你調用一個,它將不包含可執行文件的dos式返回碼。

+0

'$ Batch'有一個批處理文件和一個命令行參數。當我從PS提示符手動運行它時,'$ ReturnCode'變量返回預期的輸出,但不是從腳本中返回。 – JNK 2010-11-12 22:04:17

+0

這仍然不起作用。我需要使用這個範圍嗎?實際的命令是在一個更大的腳本中的函數。當我調用'$ LastExitCode'時,我只是空白。 – JNK 2010-11-15 14:33:30

+0

我解決了,謝謝你的幫助。 – JNK 2010-11-15 18:45:47

4

解決的方法是修改我的$Batch變量以在開始時添加cmd /c。我認爲僅僅使用Invoke-Expression和輸出參數的範圍是有問題的。我加了線:

$Batch = "cmd /c " + $Batch

然後又跑去,$ResultCode有預期的輸出。