Альтернатива запуску внешних программ в Powershell - PullRequest
1 голос
/ 17 марта 2011

При попытке запустить внешнюю программу в Powershell я смог запустить эту конкретную строку только с помощью [Diagnostics.Process]::Start(). Однако, похоже, это не работает в старых ОС, таких как Windows XP. Есть ли другая альтернатива? Я предпринял попытку бега с амперсандом (&), но это подталкивает мои аргументы. Вот что у меня есть:

$vmrc = "C:\Program Files\Common Files\VMware\VMware Remote Console Plug-in\vmware-vmrc.exe"
$vmrcArgs = "-h $($server) -p $($unencoded) -M $($moref)"

[void] [Diagnostics.Process]::Start($vmrc, $vmrcArgs)

Ответы [ 3 ]

5 голосов
/ 17 марта 2011

Start-Process также должен работать.

$vmrc = "C:\Program Files\Common Files\VMware\VMware Remote Console Plug-in\vmware-vmrc.exe"  
Start-Process -FilePath $vmrc -ArgumentList "-h $($server) -p $($unencoded) -M $($moref)"
1 голос
/ 18 марта 2011

Я обнаружил, что эта маленькая программа на С полезна для определения того, что PowerShell делает с аргументами, передаваемыми внешней программе.(Скомпилируйте его для UNICODE.)

#include "windows.h"
#include "stdio.h"

int wmain(int argc, wchar_t* argv[])
{
    wprintf(L"%s\n", GetCommandLineW());

    for (int i=0; i<argc; ++i)
    {
        wprintf(L"arg[%d]: %s\n", i, argv[i]);
    }

    return 0;
}

В вашем исходном примере это могло бы сработать, если бы вы вызвали команду как:

& $vmrc -h $($server) -p $unencoded -M $moref

Я говорю «может», потому что яне знаю, что в $ unencoded и $ moref.

Попытка вызвать его как:

& $vrmr $vmrcArgs

привела бы к значению $ vmrcArgs, заключенному в кавычки в командной строкек внешнему приложению, так что приложение, скорее всего, будет интерпретировать его как один аргумент.Поэкспериментируйте с программой на C, и вы увидите, как PowerShell пытается принимать интеллектуальные решения о цитировании, когда генерирует командную строку для внешнего приложения.

(Если вы намеревались запустить отдельный процесс, тогдаэтот ответ неуместен. Извините, если это так.)

1 голос
/ 17 марта 2011

Мне повезло, используя invoke-expression для запуска Robocopy, например, с множеством параметров командной строки.

$cmd = "$vmrc$vmrcArgs"
$out = invoke-expression $cmd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...