Как запустить внешнюю команду в PowerShell с переменным количеством параметров?

Использование plink в PowerShell: Эффективные команды и решения

В сегодняшней статье мы обсудим, как управлять SSH-сессиями в PowerShell с помощью утилиты plink. Мы рассмотрим, как правильно формировать команды и использовать параметры для достижения лучших результатов.

Базовая команда plink

Иногда вам нужно просто выполнить команду plink с определённой сессией и скриптом. Например, вы можете использовать следующую команду:

plink -t -load "$Session" -batch -m $ShellFile

Однако, в определённых ситуациях может потребоваться добавить пароль SSH к команде:

plink -t -load "$Session" -batch -m $ShellFile -pw $SshPw

Условные конструкции для управления командами

Использование условных конструкций позволяет сделать ваши команды более адаптивными:

if ($SshPw) {
    plink -t -load "$Session" -batch -m $ShellFile -pw $SshPw
} else {
    plink -t -load "$Session" -batch -m $ShellFile
}

Такой подход хотя и эффективен, может показаться избыточным, особенно если вы часто переключаетесь между различными параметрами.

Проблема с выполнением строковых команд

При попытке выполнить команду, сохранённую в переменной, с помощью &, может возникнуть ошибка:

PS C:\Users> $X="plink -t -load `"$Session`" -batch -m $ShellFile"
PS C:\Users> & $X

Ошибка будет выглядеть следующим образом:

The term 'plink -t -load "FIS-Q-LBX-PGS-101-a" -batch -m C:\<somedir>\daily.txt' is not recognized as the name of a cmdlet...

Использование Start-Process для более гибкого выполнения

Чтобы избежать вышеупомянутых проблем, рассмотрите использование Start-Process для лучшего контроля над выполнением:

Start-Process -NoNewWindow -Wait -FilePath "plink.exe" -ArgumentList '-t', '-load', '"FIS-Q-LBX-PGS-101-a"', '-batch', '-m', 'C:\<somedir>\daily.txt'

Также стоит указывать полный путь до plink для надежности, особенно если он находится в каталоге сценария.

Оптимизация с использованием разбрызгивания (splatting)

С помощью splatting вы можете облегчить задачу передачи параметров командной строке:

$plinkParams = @{
    't'     = $true
    'load'  = $Session
    'batch' = $true
    'm'     = $ShellFile
}

if ($SshPw) {
    $plinkParams['pw'] = $SshPw
}

plink @plinkParams

Это способ организовать команду более удобно и читабельно.

Использование -ArgumentList в Start-Process

Ещё один подход — использовать параметр -ArgumentList, который принимает массив аргументов:

$commonArgs = @(
    '-t',
    '-load', $Session,
    '-batch',
    '-m', $ShellFile
)

if ($SshPw) {
    $allArgs = $commonArgs + @('-pw', $SshPw)
} else {
    $allArgs = $commonArgs
}

Start-Process -FilePath 'plink' -ArgumentList $allArgs -NoNewWindow -Wait

Заключение

Использование plink в PowerShell может быть мощным инструментом для управления SSH-сессиями. Правильная обработка аргументов и использование условных конструкций позволят вам создавать гибкие и надёжные скрипты. Воспользуйтесь предложенными стратегиями, чтобы улучшить свои команды и сделать процесс работы более эффективным.

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *