从批处理调用PowerShell,并检索脚本中设置的临时环境变量的新值?

时间:2010-08-05 11:42:02

标签: scripting powershell variables batch-file environment

我希望标题简明扼要,但以防万一:

我从批处理文件中调用PowerShell脚本。我希望PowerShell脚本设置环境变量的值,并在PowerShell脚本完成时使该新值在批处理文件中可用。

我知道可以在PowerShell中使用$ env设置环境变量,但是当PowerShell脚本终止时,该值不会保留。我想这可能是因为PowerShell在一个单独的进程中执行。

我知道我可以返回退出代码并使用%ErrorLevel%,但这只会给我数字,并且会有冲突,因为1表示PowerShell异常,而不是有用的数字。

现在,请注意:我不希望环境变量持续存在。也就是说,我不希望为用户或系统定义它,因此我希望它在批处理文件退出后立即不可用。最后,我只想将结果从PowerShell脚本传递回调用批处理文件。

这可能吗?

提前致谢:)

尼克

3 个答案:

答案 0 :(得分:10)

要获得Keith使用stdout工作的想法,您可以从批处理脚本中调用powershell,如下所示:

FOR /F "usebackq delims=" %v IN (`powershell -noprofile "& { get-date }"`) DO set "d=%v"

有点尴尬,但它有效:

C:\>FOR /F "usebackq delims=" %v IN (`powershell -noprofile "& { get-date }"`) DO set "d=%v"
C:\>set d
d=August 5, 2010 11:04:36 AM

答案 1 :(得分:0)

我知道回答这个问题有点晚了,但我想尝试一下,以防任何人需要更详细的解决方案。所以,就在这里。

我创建了一个批处理函数,它将为您执行ps脚本并返回一个值,如下所示:

:: 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>
  Powershell Set-ExecutionPolicy RemoteSigned -Force
  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 <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>
  Powershell Set-ExecutionPolicy RemoteSigned -Force
  for /F "usebackq tokens=1" %%i in (`Powershell %1`) do set returnValue=%%i
  set "%2=%returnValue%"
  Goto:eof
:: End of :RunPS function

现在,如何使用:CheckMachineUpOrDown函数?

按照这个例子:

set Workstation=MyVMName
call :CheckMachineUpOrDown VMStatus %Workstation%
echo %VMStatus%

如果机器处于关机​​状态,则会显示虚拟机是否处于开启或关闭状态。

希望这有用。

由于

答案 2 :(得分:-1)

从PowerShell捕获结果的最直接方法是在PowerShell中使用stdout。例如,这会将日期保存到cmd.exe中的d env var

set d = powershell -noprofile "& { get-date }"