我想制作一个PowerShell脚本,该脚本可用于将计算机连接到各种客户端的SonicWall VPN(特别是通过Global VPN和NetExtender)。我想像一个用户界面来提示用户(它将设置变量),然后使用该信息传递给命令提示符中的命令行。
我希望能够在脚本的cmd行中应用输入的信息。
我尝试通过(使用来自应用商店的应用)并与Microsoft VPN客户端连接来使用MobileConnect连接,但是并不能捕获所有网络信息。尤其是DNS服务器。
最好的方法是安装Global VPN或NetExtender并通过cmd线路连接;这样可以获取整个网络信息。
这是运行它的基本命令:
Function Connect-VPN {
Set-Location -Path "C:\Program Files (x86)\SonicWALL\SSL-VPN\NetExtender"
cmd /c "NECLI connect -s address:4433 -u Uname -p Password -d Domain -A"
Set-Location -Path C:\
}
基本上,您可以更改目录并使用这些参数执行命令。
我想在POSH中提示,使用用户输入创建变量,然后将这些参数传递下来。
我现在拥有的是:
param(
[string]$Testadd ,
[string]$Testun ,
[string]$TestPW ,
[string]$TestDom
)
If ($Testadd -eq "")
{$Testadd = (Read-Host "test")
}
If ($Testun -eq "")
{$Testun = (Read-Host "test")
}
If ($TestPW -eq "")
{$TestPW = (Read-Host "test")
}
If ($TestDom -eq "")
{$TestDom = (Read-Host "test")
}
Set-Location -Path "C:\Program Files (x86)\SonicWALL\SSL-VPN\NetExtender"
cmd /c "NECLI connect -s "$($Testadd)" -u "$($Testun)" -p "$($TestPW)" -d "$($TestDom)" -A"
Set-Location -Path C:\
问题在于所有参数都为空。我不知道是否可能,但我想看看。
答案 0 :(得分:0)
您可以在运行cmd之前尝试构建字符串
param (
[string]$Testadd,
[string]$Testun,
[string]$TestPW,
[string]$TestDom
)
If ($Testadd -eq "")
{
$Testadd = (Read-Host "testadd")
}
If ($Testun -eq "")
{
$Testun = (Read-Host "testun")
}
If ($TestPW -eq "")
{
$TestPW = (Read-Host "testpw")
}
If ($TestDom -eq "")
{
$TestDom = (Read-Host "testdom")
}
Set-Location -Path "C:\Program Files (x86)\SonicWALL\SSL-VPN\NetExtender"
#build the string before
$cmd = "NECLI connect -s " + $($Testadd) + " -u " + $($Testun) + " -p " + $($TestPW) + " -d " + $($TestDom) + " -A"
# Or even like this
$cmd = "NECLI connect -s $Testadd -u $Testun -p $TestPW -d $TestDom -A"
# exec command
cmd /c $cmd
Set-Location -Path C:\
答案 1 :(得分:0)
要添加到@Desinternauta,我怀疑这是命令解释引号和变量的方式。也就是说,当您按原样写出字符串时,它会添加空格:
$b = "b"
Write-Host "a"$($b)"c"
输出:
a b c
好消息是双引号字符串允许您将变量嵌入到字符串中:
cmd /c "NECLI connect -s $Testadd -u $Testun -p $TestPW -d $TestDom -A"
答案 2 :(得分:0)
调用使用cmd.exe的外部exe /命令时,需要特别注意和详细说明。您也不需要直接调用cmd.exe,因为这只会发生。这是有据可查的。例如:
PowerShell: Running Executables
- 呼叫运营商&
为什么:用于将字符串视为SINGLE命令。对交易有用 带有空格。
在PowerShell V2.0中,如果您正在运行7z.exe(7-Zip.exe)或其他 以数字开头的命令,您必须使用命令 调用运算符&。
PowerShell V3.0解析器现在更加智能,在这种情况下,您不必 需要&了。
详细信息:运行命令,脚本或脚本块。呼叫接线员, 也称为“调用运算符”,使您可以运行以下命令 存储在变量中并由字符串表示。因为打电话 操作员不解析命令,无法解释命令 参数
# Example:
& 'C:\Program Files\Windows Media Player\wmplayer.exe' "c:\videos\my home video.avi" /fullscreen
- 开始过程(开始/树液)
为什么:启动一个进程并返回.Net进程对象 提供了PassThru。它还允许您控制启动过程的环境(用户配置文件,输出重定向 等等)。您还可以使用Verb参数(右键单击文件, 动作列表),以便您可以播放wav文件。
详细信息:执行一个程序,返回程序的过程对象。 应用。允许您控制文件(动词 以上所述)并控制应用运行的环境。 您还可以等待过程结束。你也可以 订阅流程Exited事件。
#Example:
#starts a process, waits for it to finish and then checks the exit code.
$p = Start-Process ping -ArgumentList "invalidhost" -wait -NoNewWindow -PassThru
$p.HasExited
$p.ExitCode
10. Stop-Parsing Symbol --%
Why: Its a quick way to handle program arguments that are not standard. Also its the new cool way to do it.
Details: The stop-parsing symbol (--%), introduced in Windows PowerShell 3.0, directs Windows PowerShell to refrain from interpreting input as Windows PowerShell commands or expressions. When calling an executable program in Windows PowerShell, placethe stop-parsing symbol before the program arguments.
After the stop-parsing symbol --% , the arguments up to the end of the line (or pipe, if you are piping) are passed as is.
#Examples:
# icacls in V2
# You must use escape characters to prevent PowerShell from misinterpreting the parentheses.
icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F
# In V3 you can use the stop-parsing symbol.
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F
另请参阅:
Using Windows PowerShell to run old command line tools (and their weirdest parameters)
Solve Problems with External Command Lines in PowerShell
报价