Обработка команды Powershell (Передающий в переменных)

Если вы используете библиотеку типов, интегрированную в python, вы можете сделать это.

import types


class TestClass:
    def __init__(self):
        self.name = None

    def __getattribute__(self, attr):
        method = object.__getattribute__(self, attr)
        if not method:
            raise Exception("Attribute %s not implemented" % attr)
        if type(method) == types.MethodType:
            self.run()
        return method

    def run(self):
        if self.name is None:
            raise Exception("'name' attribute is 'None'")

    def __call__(self):
        self.run()
        return self


def UsesTestClass(testClass):
    print(testClass.name)


testClass = TestClass()
testClass.name = "Hello"
UsesTestClass(testClass)
7
задан Guss 9 September 2009 в 19:09
поделиться

5 ответов

Оператор вызова '&' в этом случае не нужен. Он используется для вызова команды в новой области видимости. Обычно это используется для вызова команды, указанной строкой или блоком сценария. Это также имеет побочное преимущество, заключающееся в том, что любые переменные, созданные в сценарии PowerShell, отбрасываются после завершения команды и исчезновения области действия.

Однако, поскольку cmd является EXE-файлом, он выполняется в совершенно другом процессе. Кстати, вы получаете аналогичный вывод непосредственно из cmd.exe:

> cmd "/c echo foo"
foo"

Таким образом, дополнительная цитата в конце - это проблема cmd.exe. Как правило, вам нужно держать команду отдельно от параметров, когда PowerShell выполняет синтаксический анализ для вызова команды, например

45> & { $foo = "foo" }
46> $foo  # Note that $foo wasn't found - it went away with the scope
47> . { $foo = "foo" } # dotting executes in the current scope
48> $foo 
foo

. Заметным исключением здесь является то, что Invoke-Expression ведет себя как функция «оценивать эту строку». Используйте с осторожностью, особенно , если пользователь предоставляет строку. Ваш день мог бы соскучиться, если бы они предоставили "ri C: \ -r".

В этом случае, как другие предлагали, я бы вытащил / c из строки $ param string и указал бы ее, например:

cmd /c $param

Или используйте Invoke-Expression, но используйте с осторожностью. Кстати, когда вы пытаетесь отладить проблемы с отправкой аргументов в EXE из PowerShell, проверьте утилиту echoargs в расширениях сообщества PowerShell ( http://pscx.codeplex.com ). Это очень удобно:

49> $param = "/c echo foo"
50> echoargs $param
Arg 0 is </c echo foo>

Это показывает, что cmd.exe получает "/ c echo foo" в качестве единственного аргумента . «/ c» должен быть отдельным аргументом от «echo foo» (команда для выполнения).

как и другие предлагали, я бы вытащил / c из строки $ param string и указал ее, например:

cmd /c $param

Или используйте Invoke-Expression, но используйте с осторожностью. Кстати, когда вы пытаетесь отладить проблемы с отправкой аргументов в EXE из PowerShell, проверьте утилиту echoargs в расширениях сообщества PowerShell ( http://pscx.codeplex.com ). Это очень удобно:

49> $param = "/c echo foo"
50> echoargs $param
Arg 0 is </c echo foo>

Это показывает, что cmd.exe получает "/ c echo foo" в качестве единственного аргумента . «/ c» должен быть отдельным аргументом от «echo foo» (команда для выполнения).

как и другие предлагали, я бы вытащил / c из строки $ param string и указал ее, например:

cmd /c $param

Или используйте Invoke-Expression, но используйте с осторожностью. Кстати, когда вы пытаетесь отладить проблемы с отправкой аргументов в EXE из PowerShell, проверьте утилиту echoargs в расширениях сообщества PowerShell ( http://pscx.codeplex.com ). Это очень удобно:

49> $param = "/c echo foo"
50> echoargs $param
Arg 0 is </c echo foo>

Это показывает, что cmd.exe получает "/ c echo foo" в качестве единственного аргумента . «/ c» должен быть отдельным аргументом от «echo foo» (команда для выполнения).

ком ). Это очень удобно:

49> $param = "/c echo foo"
50> echoargs $param
Arg 0 is </c echo foo>

Это показывает, что cmd.exe получает "/ c echo foo" в качестве единственного аргумента . «/ c» должен быть отдельным аргументом от «echo foo» (команда для выполнения).

ком ). Это очень удобно:

49> $param = "/c echo foo"
50> echoargs $param
Arg 0 is </c echo foo>

Это показывает, что cmd.exe получает "/ c echo foo" в качестве единственного аргумента . «/ c» должен быть отдельным аргументом от «echo foo» (команда для выполнения).

9
ответ дан 6 December 2019 в 06:25
поделиться

В прошлом у меня были проблемы с оператором & call при попытке вызвать команды исполняемого типа, как вы пытаетесь. Не уверен, что понимаю почему. Однако Invoke-Expression всегда работает в этом контексте:

PS C:\> $cmd = "cmd /c echo foo"
PS C:\> Invoke-expression $cmd
foo
8
ответ дан 6 December 2019 в 06:25
поделиться

Ваш последний пример, если произошел сбой, потому что «&» обрабатывает строку как один аргумент, поэтому она ищет программу с именем «cmd / c echo foo.exe». :)

Это работает:

& $cmd $params

Что касается вопроса о двойных кавычках, кажется, что cmd не нравятся кавычки вокруг аргументов, которые ставит PowerShell. Он получает следующее:

cmd "/c echo foo"

Так что я думаю, что все после / c рассматривается как точная команда, примерно так:

echo foo"

Некоторые программы командной строки и прикольный анализ командной строки (именно поэтому PowerShell выполняет эту работу для функций и командлеты). В случае с cmd я бы предложил следующее:

$param = "echo foo"
& cmd /c $param
3
ответ дан 6 December 2019 в 06:25
поделиться

это артефакт использования cmd / c, я думаю. работает

$param = "echo foo"
cmd /c $param

работает отлично. Если у вас нет реального примера кода, то сложно решить проблему.

0
ответ дан 6 December 2019 в 06:25
поделиться

One other way I found to do this was to create an array of arguments for the command line and use that with the apersand & call operator. Something like this:

$exe = "cmd";
[Array]$params = "/c", "echo", "foo";

& $exe $params;

It's worked well for me.

I originally found this technique here: http://techstumbler.blogspot.com/2009/12/windows-commands-with-arguments-in.html

8
ответ дан 6 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: