如何更改从脚本内运行的powershell版本?

问题描述:

我想在v2模式下运行我的powershell脚本。没有包装脚本,可以做到这一点吗?如何更改从脚本内运行的powershell版本?

因此,例如,我现在可以做到这一点,如果我可以两个文件。

MainContent.ps1 

write-output 'run some code' 
Read-Host -Prompt "Scripts Completed : Press any key to exit" 


Wrapper.ps1 

powershell -version 2 -file 'MainContent.ps1' 

这将工作,但我希望我并不需要有第二个封装文件,因为我创造了一大堆这些PS1脚本,并具有封装文件将增加一倍脚本的量我我需要。

我希望我能做这样的事情。

MainContent.ps1 

Set-Powershell -version 2 
write-output 'run some code' 
Read-Host -Prompt "Scripts Completed : Press any key to exit" 

后来,我还希望每个脚本都要求提供一组凭据,而且不使用包装文件。

这是目前可能?

要清楚,我使用PowerShell

版本2
+0

请原谅我的好奇心,但为什么你需要这个?你只是试图编写可移植的脚本,还是你有特定的兼容性问题? –

+0

@RyanBemrose = compability问题。安装了PowerShell 3.0的用户会收到此错误“Microsoft .NET不支持Microsoft .NET运行时版本4.0.30319.17929”。 – Diskdrive

+0

这不仅仅是PowerShell版本。这是您需要加载的底层.NET运行时。开始一个新的过程是改变它的唯一方法。 –

如果你唯一的目标就是避免创建单独的包装脚本,你可以随时使用该脚本重新启动本身。以下脚本将始终使用PS版本2.0重新启动一次。

param([switch]$_restart) 
if (-not $_restart) { 
    powershell -Version 2 -File $MyInvocation.MyCommand.Definition -_restart 
    exit 
} 

'run some code' 
Read-Host -Prompt "Scripts Completed : Press any key to exit" 

或者你可以使它有条件。仅当版本大于2.0时,此脚本才会与版本2重新启动。

if ($PSVersionTable.PSVersion -gt [Version]"2.0") { 
    powershell -Version 2 -File $MyInvocation.MyCommand.Definition 
    exit 
} 

'run some code' 
Read-Host -Prompt "Scripts Completed : Press any key to exit" 
+0

好的,那还不错。这是一种常见的模式吗?有没有办法让它成为通用的,以便不检查版本,而是检查脚本是否第一次运行?然后,我实际上可以将其他内容放在那里,例如调用Set-Credential以让用户在特定帐户中运行脚本 – Diskdrive

+0

已修改为显示两种情况 - 有条件的重新启动和始终重新启动。 –

+0

谢谢瑞安。这正是我正在实施的逻辑线路,但感谢您为我完成! – Diskdrive