我希望标题简明扼要,但以防万一:
我从批处理文件中调用PowerShell脚本。我希望PowerShell脚本设置环境变量的值,并在PowerShell脚本完成时使该新值在批处理文件中可用。
我知道可以在PowerShell中使用$ env设置环境变量,但是当PowerShell脚本终止时,该值不会保留。我想这可能是因为PowerShell在一个单独的进程中执行。
我知道我可以返回退出代码并使用%ErrorLevel%,但这只会给我数字,并且会有冲突,因为1表示PowerShell异常,而不是有用的数字。
现在,请注意:我不希望环境变量持续存在。也就是说,我不希望为用户或系统定义它,因此我希望它在批处理文件退出后立即不可用。最后,我只想将结果从PowerShell脚本传递回调用批处理文件。
这可能吗?
提前致谢:)
尼克
答案 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 }"