这可能吗?
我一直在尝试一些简单的事情:
Start-Process -FilePath "C:\Windows\System32\cmd.exe" -verb runas -ArgumentList {echo hello1}
Run Code Online (Sandbox Code Playgroud)
CMD以管理员身份启动,但此后没有任何反应。
总而言之,当我想使用“ Remove-Item”时,我不想使用-Recurse参数,因为它会由于各种原因而引发访问被拒绝的错误。我知道如何在没有任何提示的情况下执行此操作的唯一方法是在命令提示窗口中使用rmdir。
有谁知道一种方法来抑制不带-recurse的提示,或者如何启动CMD并使用其所有参数调用rmdir?
Paul G 的回答根据您问题中的示例命令解决了您的直接问题,并有帮助地指出/c必须先于要传递给cmd.exe(或/k,如果您想保持会话打开)。
虽然使用带有Start-Process's-ArgumentList参数的脚本块很方便,但您应该知道它的局限性:
脚本块的文字内容成为传递给的单个字符串参数-ArgumentList。
因此,使用脚本块可以防止使用 PowerShell 变量和表达式作为(部分)要传递的参数。
因此,如果您想通过变量传递目标目录路径,则需要做更多的工作:
$targetDir = 'c:\foo\bar'
Start-Process -Wait -FilePath cmd -Verb RunAs -ArgumentList '/c',
'echo', 'rmdir', '/s', "`"$targetDir`""
Run Code Online (Sandbox Code Playgroud)
请注意,我已经添加echo,以预览的rmdir命令-删除它来执行实际删除。
请注意在周围使用嵌入式双引号$targetDir,不幸的是,由于已知错误,这对于正确传递带有嵌入式空格的参数是必要的。
还要注意-Wait开关,它确保命令在提升的进程退出之前不会返回 - 尽管这本身并不能保证成功完成,您必须在之后检查。
你可以添加-WindowStyle Hidden到隐形运行高架控制台窗口本身,但要注意,UAC对话框(以确认高程)显然还是会显示-除非你的PowerShell会话已经被升高。
至于:
当我想使用时,
Remove-Item我不想使用该-Recurse参数,因为它会因各种原因抛出访问被拒绝的错误。
为了删除整个目录Remove-Item- 包括其所有内容,包括子目录 - 您必须使用-Recurse.
您可以强制执行某些删除操作-Force(例如标记为只读的文件),但缺少所需权限的删除尝试永远不会成功。
虽然可以抑制相关的错误信息有-ErrorAction SilentlyContinue,在问题的项目将不会被删除,运行代码升高可能会再次成为你唯一的选择。
您几乎拥有了全部。只需在参数列表的开头添加/c或即可/k。
/c-运行命令后关闭命令提示符
/k-保持命令提示符打开
Start-Process -FilePath "C:\Windows\System32\cmd.exe" -verb runas -ArgumentList {/c echo hello1}
Run Code Online (Sandbox Code Playgroud)