对不起,如果标题看起来很奇怪,我不知道如何制定这个。
我正在尝试在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
运行脚本时它不起作用,但是当我运行没有这些参数的相同脚本时,一切正常。
有没有办法改变这种行为?
答案 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
}