我如何使用需要从命令提示符/批处理文件引用的参数调用PowerShell Start-Process命令?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何使用需要从命令提示符/批处理文件引用的参数调用PowerShell Start-Process命令?相关的知识,希望对你有一定的参考价值。

我在PowerShell中尝试执行一个命令时收到此错误:

我正在尝试exec这个命令:

powershell.exe Start-Process -FilePath "C:WindowsSystem32attrib +h +s "%CD%"" -Verb runAs

有人可以帮我弄清楚为什么会这样,以及如何解决它?

答案

有人可以帮我弄清楚为什么会这样吗?

-FilePath cmdlet的Start-Process参数需要可执行文件的名称或路径,而不是整个命令行。

传递给通过-FilePath指定的可执行文件的参数必须通过-ArgumentList-Args)参数作为数组单独传递。

cmd.exe(一个批处理文件)调用时,在一个"封闭的参数中,传递整个命令行以供PowerShell评估是概念上更清晰:

powershell.exe -Command "Start-Process -Verb RunAs -FilePath attrib.exe -Args +h, +s, '"%CD%"'"

请注意需要双倍地逃避%CD%值,首先将其封装在'中,然后在"里面:外部'确保PowerShell本身将值识别为单个参数,嵌入式"引用确保最终目标计划attrib.exe也将价值看作一个单独的论点。

这种双重逃逸的需要是不幸的,不应该是必要的 - 它在this GitHub issue中讨论过。

另一答案

无需完全限定attrib.exe的路径,它可以通过DOS和PoSH环境变量本机获得。

powershell attrib 'd:	empSomeFile.txt'
# A                    D:	empSomeFile.txt

powershell attrib +r 'd:	empSomeFile.txt'

powershell attrib 'd:	empSomeFile.txt'
# A    R               D:	empSomeFile.txt

任何带空格的字符串都必须用引号括起来,或者参数必须单独传递。

Start-Process powershell -ArgumentList "-NoExit","-Command  &{ $ConsoleCommand }" -Wait

在你的用例和我展示的内容中,你所做的就是调用PoSH来运行你可以在DOS中执行的DOS命令。那么,除了runas之外,为什么要使用PoSH呢?

此外,当您按照自己的方式执行命令时,正确引用以正确限定该命令以运行可能会令人困惑。这条线路的真正问题是什么。传递参数必须正确完成,空格如果处理不当会导致问题,从而导致错误。

另外,为什么要从cmd.exe开始这项工作,只是最终炮轰到PoSH控制台主机运行此命令?

只是在PoSH控制台主机中本地执行此操作,这本质上就是您正在做的事情。节省自己额外的步骤和复杂性。

只需启动powershellexe,而不是cmd.exe并运行您的DOS命令。

attrib +r 'd:	empSomeFile.txt'

有一点cmd.exe可以做到的PoSH控制台无法和PoSH(控制台主机和ISE)有很多东西可以做到cmd.exe无法做到的事情。那么,为什么不在本土开始并留在PoSH?

您可以在PoSH控制台主机中运行所有DOS命令(在ISE中,需要更多努力才能使它们工作)本机,或者只使用PoSH等效项。

使用PowerShell Cmdlet处理文件属性---'blogs.technet.microsoft.com/heyscriptingguy/2011/01/26/use-a-powershell-cmdlet-to-work-with-file-attributes'

我知道,那个牙齿有点长。但是,您也可以执行以下操作,获取属性,并使用类似但不同的cmdlet修改它们。

(Get-ChildItem -Path 'D:TempSomeFile.txt').Attributes
# ReadOnly, Archive

# or this
(gci 'D:TempSomeFile.txt').Attributes

# or this
(dir 'D:TempSomeFile.txt').Attributes

# or this
(ls 'D:TempSomeFile.txt').Attributes

以上每一个都完全相同。设置属性就是这个......

Set-ItemProperty -Path 'D:TempSomeFile.txt'-Name IsReadOnly -Value $false

# or
sp 'D:TempSomeFile.txt' IsReadOnly $false

(ls 'D:TempSomeFile.txt').Attributes
# Archive

当然可以使用.bat来调用PoSH脚本文件。但如果你只是坐在一个航站楼,根据需要挑选一个或另一个。

以上是关于我如何使用需要从命令提示符/批处理文件引用的参数调用PowerShell Start-Process命令?的主要内容,如果未能解决你的问题,请参考以下文章

SQLPlus 批处理文件 - 如何返回到命令提示符?

Windows 7 命令提示符:如何从命令行执行批处理脚本?

如何使用命令提示符或批处理文件从字符串中删除某些字符?

如何使批处理文件在 anaconda 提示符下运行

如何将参数传递给批处理文件?

如何将标准输入重定向到 Windows 命令行中的文件?