【发布时间】:2019-07-11 02:43:15
【问题描述】:
我遇到的情况是 cmd 脚本必须启动 powershell 脚本 (install.ps1),如果 cmd 还没有,则提升为管理员。启动 powershell 的行如下所示:
powershell -WindowStyle Hidden "Start-Process powershell \"-NoP -Exec Bypass -File `\"%~dp0install.ps1`\" %args%\" -Verb runAs -Wait"
或者这也有效:
powershell -WindowStyle Hidden "Start-Process powershell \"-NoP -Exec Bypass invoke-command { %~dp0install.ps1 %args% } \" -Verb runAs -Wait"
我想将 install.ps1 脚本的输出重定向到一个用于记录目的的文件,但在执行此操作时遇到了问题。类似以下的内容会生成 log.txt 文件,但输出仍会显示在控制台中,并且生成的 log.txt 文件将为空:
powershell -WindowStyle Hidden "Start-Process powershell \"-NoP -Exec Bypass invoke-command { %~dp0install.ps1 %args% } \" *> log.txt -Verb runAs -Wait"
将*> log.txt 部分移动到 Start-Process 块内部(就在 invoke-command 块之后),我认为这将是关键,似乎根本没有运行脚本(或者它正在闪烁一个错误控制台太快无法看到,因为它会立即关闭)。
当我想要的数据被埋在由 cmd 文件执行的几层 powershell 中时,是否可以实现这种日志记录行为?
从技术上讲,我们通过创建一个由 cmd 调用/提升的 powershell 包装器脚本,然后在包装器中调用 install.ps1 脚本并在该调用中分配日志记录来实现此功能。不幸的是,额外的脚本层会导致一系列其他棘手/更关键的问题,这些问题涉及从命令行一直传递到正确的安装脚本的参数,所以我们真的试图避免这条路线。
编辑
感谢@mklement0 提供需要转义重定向的指针,这是我的问题。后续问题 - 以下命令非常适合记录到文件,但有没有办法在调用 PS 脚本(“-Command %~dp0pg.ps1”)时使用 -File 而不是 -Command 获得相同的行为?
powershell -Command "Start-Process -WindowStyle Hidden -Verb RunAs -Wait powershell \"-NoProfile -ExecutionPolicy Bypass -Command %~dp0pg.ps1 *^> %CD%\log.txt\""
【问题讨论】:
标签: powershell cmd