格式化字符串命令在控制台中工作,但在脚本中不工作。[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