我想在批量但有条件的情况下使用Start-Process
运行PowerShell程序。
我测试了它,然后使用cmd /c
命令运行Start-Process
。
命令:
powershell -Command "Start-Process `cmd /c` -Verb runas"
它没用。
所以我在PowerShell上测试了它。尝试相同的命令,它返回此错误:
Start-Process : A positional parameter cannot be found that accepts argument 'runas'. At line:1 char:14 + Start-Process <<<< 'cmd /c' -Verb runas + CategoryInfo : InvalidArgument: (:) [Start-Process], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand
如何使用powershell
命令和主PowerShell批量处理这项工作?
PowerShell中的反引号转义字符。在一份声明中
Start-Process `cmd /c` -Verb runas
反叛者逃离了c
的cmd
和/c
之后的空间。前者没有问题,因为它只是让c
成为文字c
(无论如何)。然而,逃离/c
和-Verb
之间的空间有效地将整个序列/c -Verb
变成单个字符串。基本上它就像你运行这个语句一样:
Start-Process cmd "/c -Verb" runas
由于Start-Process
只接受2个位置参数(-FilePath
和-ArgumentList
),所以其他一切必须通过命名参数传递。因此,没有位置参数接受参数runas
的错误。
像这样运行命令:
Start-Process cmd /c, dir, "$env:windir\temp" -Verb runas
要么
Start-Process -FilePath 'cmd.exe' -ArgumentList '/c', 'dir', "$env:windir\temp" -Verb runas
或者像这样(来自CMD):
powershell.exe -Command "Start-Process cmd /c, dir, \"$env:windir\temp\" -Verb runas"
它会像你期望的那样工作。
编辑
由于显然最初不够清楚:-ArgumentList
参数的参数是以逗号分隔的列表(数组)。
Start-Process cmd /c, dir, "$env:windir\temp" -Verb runas
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^
# this right here