Передать переменные Powershell в строку командной строки - PullRequest
0 голосов
/ 17 апреля 2019

Я хочу создать сценарий PowerShell, который можно использовать для подключения компьютеров к различным SonicWall VPN различных клиентов (в частности, через Global VPN и NetExtender).Я хотел бы, чтобы он был похож на пользовательский интерфейс, чтобы запрашивать пользователя (который будет устанавливать переменные), а затем использовать эту информацию для передачи в командные строки в командной строке.

Я хочу иметь возможностьнеобходимо ввести введенную информацию в строку cmd в сценарии.

Я пытался использовать соединение MobileConnect через (используя приложение из магазина приложений) и соединиться с клиентом Microsoft VPN, но это незахватить всю информацию о сети;в частности, 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:\

Проблемав том, что все аргументы выходят пустыми.Я не знаю, возможно ли это, но я хотел увидеть.

Ответы [ 3 ]

0 голосов
/ 17 апреля 2019

Чтобы добавить в @Desinternauta, я подозреваю, что именно так команда интерпретирует кавычки и переменные.т.е. когда вы записываете строку, как она есть, она добавляет пробелы:

$b = "b"
Write-Host "a"$($b)"c"

Выводы:

a b c

Хорошая новость заключается в том, что строки в двойных кавычках позволяют встраивать переменныев строку:

cmd /c "NECLI connect -s $Testadd -u $Testun -p $TestPW -d $TestDom -A"
0 голосов
/ 17 апреля 2019

Вызов внешних exe / команд, использующих cmd.exe, требует особого внимания и особенностей вывода.Вам также не нужно напрямую вызывать cmd.exe, поскольку это просто произойдет.Это хорошо задокументировано.Например:

PowerShell: запуск исполняемых файлов

Оператор вызова &

Зачем: используется для обработки строки как команды 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
Start-Process (start / saps)

Зачем: запускает процесс и возвращает объект процесса .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

См. Также:

Использование Windows PowerShell для запуска старых инструментов командной строки (и их самых странных параметров)

Решение проблем с внешними командными строками в PowerShell

Цитирование

О правилах цитирования

История правил цитирования PowerShell

0 голосов
/ 17 апреля 2019

Вы можете попытаться построить строку перед запуском 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:\

...