start-process powershell运行另一个powershell来运行带参数的另一个程序。不适用于args,但适用于args

时间:2018-06-16 05:05:12

标签: powershell

对不起,如果标题看起来很奇怪,我不知道如何制定这个。

我正在尝试在PowerShell的新实例中运行我的脚本以在后台运行OpenVPN,但是当从start-process调用时,我无法将任何参数传递给OpenVPN。

function ConnectOpenVPN{

  [Parameter(Mandatory=$true, Position=0)]
  [string] $ip,
  [Parameter(Mandatory=$true, Position=1)]
  [string] $user
  [Parameter(Mandatory=$true, Position=2)]
  [string] $pass
  [Parameter(Mandatory=$true, Position=2)]
  [string] $id    

  $temp = New-TemporaryFile
  $credentials =  $user + "`n"  + $pass
  $credentials| Set-Content $temp  
  $config = "C:\Program Files (x86)\OpenVPN\config\" + $id + ".ovpn"
  $file = $temp.FullName


  Start-Process powershell -args "& C:\'Program Files'\OpenVPN\bin\openvpn.exe --config $config --auth-user-pass $file"

  #delete temp file
}

当我使用--config $config --auth-user-pass $file运行脚本时它不起作用,但是当我运行没有这些参数的相同脚本时,一切正常。

有没有办法改变这种行为?

2 个答案:

答案 0 :(得分:0)

当你启动新的PowerShell窗口时,它的范围与你运行命令的窗口完全不同。这个新的范围不知道你的$ config和$ file变量,所以当你使用它们时它会失败,因为你传递的是空白参数。

要解决此问题,您需要在将变量传递给-args参数之前对其进行插值,以便它们出现在start-process的范围内。

function ConnectOpenVPN{

[Parameter(Mandatory=$true, Position=0)]
[string] $ip,
[Parameter(Mandatory=$true, Position=1)]
[string] $user
[Parameter(Mandatory=$true, Position=2)]
[string] $pass
[Parameter(Mandatory=$true, Position=2)]
[string] $id    

$temp = New-TemporaryFile
$credentials =  $user + "`n"  + $pass
$credentials| Set-Content $temp  
$config = "C:\'Program Files (x86)'\OpenVPN\config\" + $id + ".ovpn"
$file = $temp.FullName
$openVPN = "c:\'program files'\openvpn\bin\openvpn.exe"
$cmd = "& $openVPN --config $config --auth-user-pass $file"

Start-Process powershell.exe -args $cmd

#delete temp file
}

此外,您还需要查看$ file和$ config周围的引号,因为至少后者包含空格。

答案 1 :(得分:0)

这应该可以解决问题。 请注意如何将带参数的命令传递给Start-Process&函数。

function ConnectOpenVPN{

  [Parameter(Mandatory=$true, Position=0)]
  [string] $ip,
  [Parameter(Mandatory=$true, Position=1)]
  [string] $user
  [Parameter(Mandatory=$true, Position=2)]
  [string] $pass
  [Parameter(Mandatory=$true, Position=2)]
  [string] $id    

  $temp = New-TemporaryFile
  $credentials =  $user + "`n"  + $pass
  $credentials| Set-Content $temp  
  $config = "C:\Program Files (x86)\OpenVPN\config\" + $id + ".ovpn"
  $file = $temp.FullName

  Start-Process -FilePath powershell -ArgumentList @("-command", "& 'C:\Program Files\OpenVPN\bin\openvpn.exe' '--config' $config '--auth-user-pass' $file")

  #delete temp file
}