格式化字符串命令在控制台中工作,但在脚本中不工作。[POWERSHELL]

格式化字符串命令在控制台中工作,但在脚本中不工作。[POWERSHELL],powershell,Powershell,下面的脚本应该以mm:ss整数值返回格式化时间 从脚本运行时将被视为前景色操作符,但在控制台运行时运行正常 另外,使用System.Math类也会显示类似的行为 在Powershell ISE 5.1.18362.752和Visual studio code 1.48.2(Windows 10pro-64位)中尝试了脚本 如何从脚本中获取格式化结果 SCRIPT: $global:started = Get-Date Write-Host "Script_Started"

下面的脚本应该以
mm:ss
整数值返回格式化时间

脚本运行时
将被视为前景色操作符,但在
控制台运行时
运行正常

另外,使用
System.Math
类也会显示类似的行为

在Powershell ISE 5.1.18362.752和Visual studio code 1.48.2(Windows 10pro-64位)中尝试了脚本

如何从脚本中获取格式化结果

SCRIPT:
$global:started = Get-Date

Write-Host "Script_Started" 


Start-Sleep -Seconds 3 
    
$stopped = Get-Date
$elapsed = $stopped - $global:started 
Write-Host 'elapsed_time = ' $elapsed
Write-Host 'elapsed_time = {0:mm} min : {0:SS} sec ' -f $elapsed
Write-Host 'elapsed_time = {0:n0} '-f $elapsed.TotalSeconds ' seconds'

Write-Host "elapsed_time = " [System.Math]::Round($elapsed.TotalSeconds) 'seconds'
Write-Host 'elapsed_time = ' [math]::Round(($elapsed.TotalSeconds).ToString()) 'seconds'

Write-Host 'Script_Exited '   


当PowerShell解析器看到以下形式的表达式时:

[commandname] [some other stuff]
。。。对于
[一些其他东西]
部分,它会切换到一种称为“参数模式解析”的方式,解析规则与语言的其他部分有很大不同:

Text          Meaning in Argument-Mode    Regular Meaning
-------------------------------------------------------------
bareString    Expandable string           Command Name
-word         Named Parameter             Operator (assuming 'word' is a valid operator name)
因此,当您在参数模式上下文中使用
-f
时,PowerShell会尝试将
-f
解析为您调用的命令的参数

由于
Write Host
只有一个名称以
f
开头的参数(即
-ForeGroundcolor
),PowerShell会选择该参数作为最佳匹配,并且会出现一系列错误

转义参数模式解析与将
-f
表达式封装在子表达式或嵌套管道中一样简单:

Write-Host $('elapsed_time = {0:n0} '-f $elapsed.TotalSeconds) ' seconds'
# or 
Write-Host ('elapsed_time = {0:n0} '-f $elapsed.TotalSeconds) ' seconds'


您可以在关于实现Powershell解析方法的

中阅读有关解析行为的更多信息,获得了以下结果-


脚本:-

$global:started = Get-Date

Write-Host "Script_Started" 


Start-Sleep -Seconds 3 
    
$stopped = Get-Date
$elapsed = $stopped - $global:started 
Write-Host 'elapsed_time = ' $elapsed
$timespan = New-TimeSpan -Start $global:started -End   $stopped
Write-Host 'time_span = ' $timespan

Write-Host ''
Write-Host '------------------Parse Time ------------------------'
Write-Host ''

Write-Host ('time_span =  {0:mm} min: {0:ss} sec' -f $timespan )
Write-Host ('elapsed_time = {0:mm} min: {0:ss} sec' -f $elapsed )
Write-Host 'elapsed_time_system.math = '$([System.Math]::Round($elapsed.TotalMinutes)) 'min:' $([System.Math]::Round($elapsed.TotalSeconds)) ' sec'
Write-Host 'elapsed_time_math = ' ([math]::Round($elapsed.TotalMinutes.ToString()))'min:' ([math]::Round($elapsed.TotalSeconds.ToString())) 'sec'

Write-Host 'Script_Exited ' 

控制台:-

Script_Started
elapsed_time =  00:00:03.0062721
time_span =  00:00:03.0062721

------------------Parse Time ------------------------

time_span =  00 min: 03 sec
elapsed_time = 00 min: 03 sec
elapsed_time_system.math =  0 min: 3  sec
elapsed_time_math =  0 min: 0 sec
Script_Exited 

    

'appeased_time={0:n0}'-f$appeased.TotalSeconds
更改为
('appeased_time={0:n0}'-f$appeased.TotalSeconds)
-f也支持
TimeSpan
格式,输入不必是
DateTime
有点麻烦,您需要使用反斜杠转义非格式字符:
“{0:mm\.ss}'-f(New TimeSpan-Minutes 12-Seconds 4)
,使用$eassed=New TimeSpan[[-Start]][-End]]输出字符串
12.04
,然后使用上面的-f操作符命令,{0:mm}min:{0:ss}sec'工作。
Script_Started
elapsed_time =  00:00:03.0062721
time_span =  00:00:03.0062721

------------------Parse Time ------------------------

time_span =  00 min: 03 sec
elapsed_time = 00 min: 03 sec
elapsed_time_system.math =  0 min: 3  sec
elapsed_time_math =  0 min: 0 sec
Script_Exited