ChatGPT解决这个技术问题 Extra ChatGPT

PowerShell 中用于脚本测试的 Echo 等效项

我想通过设置标志并查看整个脚本中的数据矩阵来在 PowerShell 脚本中输出变量和值。

我该怎么做?

例如,与以下 PHP 代码等效的 PowerShell 是什么?

echo "filesizecounter: " . $filesizecounter 
查看 PowerGUI 附带的脚本编辑器/调试器。它可能适合您正在做的事情。我知道 Powershell 2 也带有调试器(但我没有尝试过)。

J
Jacktose

有几种方法:

Write-Host:直接写入控制台,不包含在函数/cmdlet 输出中。允许设置前景色和背景色。

Write-Debug:如果 $DebugPreference 设置为 Continue 或 Stop,则直接写入控制台。

Write-Verbose:如果 $VerbosePreference 设置为 Continue 或 Stop,则直接写入控制台。

后者用于提供额外的可选信息,Write-Debug 用于调试(因此似乎适合这种情况)。

附加:在 PSH2(至少)中,使用 cmdlet 绑定的脚本将自动获取 -Verbose-Debug 开关参数,在本地启用 Write-VerboseWrite-Debug(即覆盖首选项变量)为编译的 cmdlet 和提供程序可以。


Write-Debug 和 Write-Verbose 的好处是您可以将调试语句留在代码中,并在需要时使用适当的首选项变量打开输出。节省时间,对于您的功能的其他用户来说是一个很好的功能。
您还想熟悉 Out-String,因为对于任何重要的对象,在使用这三个 Write-* cmdlet 中的任何一个之前,您都需要使用它将对象转换为可显示的字符串。
g
galoget

Powershell 有一个别名映射 echoWrite-Output,因此您可以使用:

echo "filesizecounter : $filesizecounter"

根据 Microsoft 的 TechNet 和讨论的 hereechoWrite-Output 的别名
谢谢 Glenn,自从我发布这个别名以来,这个别名似乎在 6 年内被重新映射。这很好,一个人真的不应该使用 Write-Host 因为它绕过了管道。我已经更新了我的回复以表明这一点。谢谢!
如果您只想将“调试”输出回显到控制台以跟踪脚本的执行,为什么不想绕过管道? Write-Output 有一个奇怪的副作用,最后一次调用 Write-Output 的内容将留在堆栈上,覆盖您尝试从函数显式返回的任何变量。对于一种语言来说,这样的副作用感觉就像是一种非常古怪的行为方式。
P
Peter Mortensen

PowerShell 内插,不是吗?

在 PHP 中

echo "filesizecounter: " . $filesizecounter 

也可以写成:

echo "filesizecounter: $filesizecounter" 

在 PowerShell 中,这样的东西应该适合您的需求:

Write-Host "filesizecounter: $filesizecounter"

a
aphoria
Write-Host "filesizecounter : " $filesizecounter 

G
Goyuix

到目前为止,在 powershell 中回显的最简单方法是创建字符串对象并让管道输出它:

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

当然,当不使用 Write-* 方法时,您确实放弃了一些灵活性。


C
Community

echo 是 Write-Output 的别名,尽管它看起来与 Write-Host 相同。

这不是 What is the difference between echo and Write-Host in PowerShell?

echo 是 Write-Output 的别名,它写入 Success 输出流。这允许通过管道处理输出或将输出重定向到文件中。 Write-Host 直接写入控制台,因此无法进一步重定向/处理输出。


K
Ken Y-N

写主机工作正常。

$Filesize = (Get-Item $filepath).length;
Write-Host "FileSize= $filesize";

l
lauxjpn

还应该提到的是,Set-PSDebug 类似于老式的 echo on 批处理命令:

Set-PSDebug -Trace 1

此命令将导致显示执行脚本的每一行:

当 Trace 参数的值为 1 时,每行脚本都会在运行时被跟踪。当参数的值为 2 时,还会跟踪变量赋值、函数调用和脚本调用。如果指定了 Step 参数,则在脚本的每一行运行之前都会提示您。


我认为这是正确的答案,坦率地说,因为 PS 的默认行为不是自动写出命令。 +1 投票!
R
Russ Van Bert

PowerShell 具有多个常用命令(如 echo)的别名。在 PowerShell 中键入以下内容:

Get-Alias echo

得到回应:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           echo -> Write-Output

甚至 Get-Alias 也有一个别名 gal -> Get-Alias。您可以编写 gal echo 来获取 echo 的别名。

gal echo

此处列出了其他别名:https://docs.microsoft.com/en-us/powershell/scripting/learn/using-familiar-command-names?view=powershell-6

cat dir mount rm cd echo move rmdir chdir erase popd sleep clear h ps sort cls history pushd tee copy kill pwd type del lp r write diff ls ren


P
Peter Mortensen

我不知道这样做是否明智,但你可以写

"filesizecounter: " + $filesizecounter

它应该输出:

文件大小计数器:值


"filesizecounter: $filesizecounter" 甚至更短。
C
Chillie

尝试 Get-Content .\yourScript.PS1,您将看到脚本的内容。

你也可以在你的脚本代码中插入这一行:

get-content .\scriptname.PS1
script code
script code

……


不显示已处理的实际值(例如 env var 替换),因此不能回答所提出的问题。