在 Powershell 脚本中复制命令的目的是啥?

Posted

技术标签:

【中文标题】在 Powershell 脚本中复制命令的目的是啥?【英文标题】:What is the purpose of duplicating commands in a Powershell script?在 Powershell 脚本中复制命令的目的是什么? 【发布时间】:2016-05-29 11:30:44 【问题描述】:

我从一位突然离开我们公司的开发人员那里继承了一堆 powershell 脚本。虽然我能够遵循脚本的逻辑,但许多命令是重复的,如下所示:

"cd " + $targetDirectory
cd $targetDirectory

"hg pull"
& hg pull

"hg revert --all"
& hg revert --all

"hg up default"
& hg up default 

第一个始终包含引号,第二个具有某种 powershell 语法。

这样复制命令的目的是什么,即达到什么目的?

【问题讨论】:

不用“复制”每一行,您可以使用Set-PSDebug -trace 1获得相同的结果(在命令执行之前列出命令) 在理解这些脚本的工作方式时可能会发现有用的方法是使用 Powershell 集成脚本环境 (ISE) 并在脚本的第一行设置断点(F9 键),然后逐步执行脚本一次一行(F10)并观察每一行发生了什么。对于 OP 中的脚本,您将看到每对中的第一行输出到控制台,第二行执行命令。 【参考方案1】:

我认为这是相当糟糕的做法。本质上,这只是创建一个包含正在运行的命令的字符串,并将其发送到输出流,您可能会在控制台中看到它。然后它执行实际的命令。

这就像必须手动回显所有内容。如果必须将字符串发送到控制台,则应使用Write-Host 或(在我看来)Write-Verbose 发送,这样它们就不再是输出流的一部分了。

您可以在自己的脚本中使用Set-PSDebug -Trace 1(感谢Χpẘ)。

尤其是在较新版本的 powershell 中,有一些方法可以将在任何 powershell 会话中运行的每个命令(即使您无权访问正在运行的代码)记录到事件日志中。目前我很难找到一篇好的文章来链接,但它可能值得研究。

【讨论】:

这最后一条建议很有道理,这确实是一种不好的做法 Set-PSDebug -trace 1 将跟踪每一行。它至少从 PS 2.0 就已经存在【参考方案2】:

它只是为了在控制台中输出正在运行的命令,就在它运行之前,几乎就像调试消息一样。

【讨论】:

以上是关于在 Powershell 脚本中复制命令的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

powershell是啥

win10中的Windows PowerShell是啥?都有哪些作用

win10中的Windows PowerShell是啥?都有哪些作用

windows cmd上的“触摸”等价物是啥? [复制]

一键帮你复制多个文件到多个机器——PowerShell小脚本(内附PS远程执行命令问题解析)

确定当前 PowerShell 脚本位置的最佳方法是啥?