从Powershell从脚本块中的参数启动CMD.exe?

时间:2018-10-15 21:57:05

标签: powershell cmd

这可能吗?

我一直在尝试简单的事情:

Start-Process -FilePath "C:\Windows\System32\cmd.exe" -verb runas -ArgumentList {echo hello1}

CMD以管理员身份启动,但此后没有任何反应。

长话来说,当我想使用“ Remove-Item”时,我不想使用-Recurse参数,因为它会由于各种原因而引发访问被拒绝的错误。我唯一不知道怎么做的方法是在命令提示符窗口中使用rmdir。

有人知道不使用-recurse抑制提示的方法,还是我如何启动CMD并使用所有参数调用rmdir的方法?

2 个答案:

答案 0 :(得分:4)

您几乎掌握了全部内容。只需在参数列表的开头添加/c/k

/c-运行命令后关闭命令提示符
/k-保持命令提示符打开

Start-Process -FilePath "C:\Windows\System32\cmd.exe" -verb runas -ArgumentList {/c echo hello1}

答案 1 :(得分:3)

Paul G's answer根据问题中的示例命令解决了您的紧迫问题,并指出 /c必须先于任何命令传递给cmd.exe (或/k(如果要保持会话打开)。

虽然很方便地使用带有Start-Process的{​​{1}}参数的脚本块,但您应该知道其限制

  • 脚本块的文字内容变为单个字符串参数,并传递给-ArgumentList

  • 因此,使用脚本块会阻止使用PowerShell变量和表达式作为要传递的参数的一部分。

因此,如果要通过变量 传递目标目录路径,则需要做更多的工作:

-ArgumentList

请注意,我添加了$targetDir = 'c:\foo\bar' Start-Process -Wait -FilePath cmd -Verb RunAs -ArgumentList '/c', 'echo', 'rmdir', '/s', "`"$targetDir`"" ,以便对echo命令进行预览-将其删除以执行实际的删除操作。

请注意在rmdir周围使用 embedded 双引号,不幸的是,由于 known bug

还要注意$targetDir开关,可确保在提升的进程退出之前命令不会返回-尽管它本身不能保证成功完成 以后必须检查。

您可以添加-Wait以不可见地运行提升的控制台窗口,但请注意,UAC对话框(用于确认提升)显然仍会显示-除非您的PowerShell会话已经提升


至:

  

当我想使用-WindowStyle Hidden时,我不想使用Remove-Item参数,因为它会由于各种原因而引发拒绝访问错误。

要删除包含-Recurse的整个目录-包括其所有内容,包括子目录,您必须使用Remove-Item

您可以强制进行{em>某些删除,而不会出现-Recurse的投诉(例如标记为只读的文件),但是删除缺少必需的权限永远不会成功。

虽然您可以使用-Force取消关联的错误消息,但问题中的项目不会被删除,并且运行代码升高可能会再次您唯一的选择。