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

问题描述 投票:1回答:2

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

我正在尝试exec这个命令:

powershell.exe Start-Process -FilePath "C:\Windows\System32\attrib +h +s "%CD%"" -Verb runAs

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

powershell batch-file syntax quoting
2个回答
2
投票

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

-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中讨论过。


0
投票

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

powershell attrib 'd:\temp\SomeFile.txt'
# A                    D:\temp\SomeFile.txt

powershell attrib +r 'd:\temp\SomeFile.txt'

powershell attrib 'd:\temp\SomeFile.txt'
# A    R               D:\temp\SomeFile.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:\temp\SomeFile.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:\Temp\SomeFile.txt').Attributes
# ReadOnly, Archive

# or this
(gci 'D:\Temp\SomeFile.txt').Attributes

# or this
(dir 'D:\Temp\SomeFile.txt').Attributes

# or this
(ls 'D:\Temp\SomeFile.txt').Attributes

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

Set-ItemProperty -Path 'D:\Temp\SomeFile.txt'-Name IsReadOnly -Value $false

# or
sp 'D:\Temp\SomeFile.txt' IsReadOnly $false

(ls 'D:\Temp\SomeFile.txt').Attributes
# Archive

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

© www.soinside.com 2019 - 2024. All rights reserved.