我尝试使用commande从批处理文件执行powershell: Powershell。\ nameoffile.ps1
powershell返回一些值1,4,0和-1。如何从批次中获取这些值?当我使用%errorlevel%时,它只返回0(这意味着脚本没问题)。我也尝试在powershell中使用Exit命令(退出4),但它不起作用。 你能救我吗?
此致
修改 如果有人有兴趣,我找到了解决方案。谢谢你的时间
powershell"& {。\ test.ps1%*;退出$ LastExitCode}"组 代码=%ERRORLEVEL%
答案 0 :(得分:8)
如果您需要在蝙蝠环境中使用此值,请使用FOR /F
:
@echo off
for /f "delims=" %%a in ('powershell .\test.ps1') do Set "$Value=%%a"
Echo Value received from Powershell : %$Value%
答案 1 :(得分:2)
powershell "&{.\test.ps1 %* ;exit $LastExitCode}" set code=%errorlevel%
答案 2 :(得分:0)
这样的事情怎么样?
<强> test.bat的强>
@echo off
powershell .\test.ps1 >output.log
type output.log
它只是将powershell脚本的输出重定向到文本文件,然后将文本文件的内容输出到控制台。
这是我的 test.ps1 文件
Write-Output "Hello World"
Exit
这是输出:
C:\ temp \ batchtest&gt; test.bat
Hello World
C:\ TEMP \ batchtest&GT;
答案 3 :(得分:0)
如何使用tee-object这将在主机控制台中显示返回的值
答案 4 :(得分:0)
我知道回答这个问题有点晚了,但我想尝试一下,以防任何人需要更详细的解决方案。所以,就在这里。
我创建了一个批处理函数,它将为您执行ps脚本并返回一个值,如下所示:
function formatCurrency(number) {
return (number != null && number != "") ? "$".concat(parseFloat(number).toFixed(2).toString()
.split('').reverse().join("")
.replace(/\d\d\d(?!$)/g, "$&,")
.split('').reverse().join("")) : number;
}
现在,作为使用它的一个例子:
:: A function that would execute powershell script and return a value from it.
:: <PassPSCMD> pass the powreshell command, notice that you need to add any returning value witth Write-Host
:: <RetValue> the returned value
:RunPS <PassPSCMD> <RetValue>
for /F "usebackq tokens=1" %%i in (`Powershell %1`) do set returnValue=%%i
set "%2=%returnValue%"
Goto:eof
:: End of :RunPS function
这将显示在控制台屏幕上你明白了
作为一个更复杂的例子,我想补充一下:
我们假设我们要检查虚拟机是启用还是关闭,这意味着启动或关闭,我们可以执行以下操作:
set psCmd="&{ Write-Host 'You got it';}"
call :RunPS %psCmd% RetValue
echo %RetValue%
现在,如何使用:CheckMachineUpOrDown函数?
按照这个例子:
:CheckMachineUpOrDown <returnResult> <passedMachineName>
set userName=vCenterAdministratorAccount
set passWord=vCenterAdminPW
set vCenterName=vcenter.somedmain.whatever
set psCmd="&{Add-PSSnapin VMware.VimAutomation.Core; Connect-VIServer -server %%vCenterName%% -User %userName% -Password %passWord%; $vmServer = Get-VM %2;Write-Host ($vmServer.PowerState -eq 'PoweredOn')}"
call :RunPS %psCmd% RetValue
if "%RetValue%" EQU "True" (set "%1=Up") else (set "%1=Down")
Goto:eof
:: A function that would execute powershell script and return a value from it.
:: <PassPSCMD> pass the powreshell command, notice that you need to add any returning value witth Write-Host
:: <RetValue> the returned value
:RunPS <PassPSCMD> <RetValue>
for /F "usebackq tokens=1" %%i in (`Powershell %1`) do set returnValue=%%i
set "%2=%returnValue%"
Goto:eof
:: End of :RunPS function
如果机器处于关机状态,则会显示虚拟机是否处于开启或关闭状态。