Powershell: Range operator (aka DotDot operator) with char operands in pipeline throws error

Created on 21 Nov 2017  路  8Comments  路  Source: PowerShell/PowerShell

Steps to reproduce

```'
A'..'B'
'A'..'B' | ForEach-Object { $_ }


Expected behavior
-----------------

A
B
```

Actual behavior

Cannot convert value "A" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:1

  • 'A'..'B' | ForEach-Object { $_ }
  • ~~~~~~~~
  • CategoryInfo : InvalidArgument: (:) [], RuntimeException
  • FullyQualifiedErrorId : InvalidCastFromStringToInteger```

Environment data

Name Value ---- ----- PSVersion 6.0.0-rc PSEdition Core GitCommitId v6.0.0-rc OS Microsoft Windows 10.0.15063 Platform Win32NT PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 WSManStackVersion 3.0

Issue-Bug Resolution-Fixed Up-for-Grabs WG-Engine

Most helpful comment

@IISResetMe - the idea was to name tokens after the syntactic form because it might not make sense if a token was allowed in some new context, e.g. if .. was allowed where it is no longer the range operator.

All 8 comments

repros for me.

Interesting; I didn't even know support for _character_ ranges was implemented. Can I suggest changing "dotdot operator" to "range operator" in the title?

I went with "dotdot operator" because that is what was used in the PR that added the character range implementation. https://github.com/PowerShell/PowerShell/pull/5026

I see - that very nonstandard name is the reason that I wasn't able to find this new feature, despite then already knowing that it exists (based on this issue - that someone else would call it "DotDot operator" too hadn't occurred me), so thank you for adding the link.

I guess _my_ mentioning the construct's official name here - _range operator_ - now makes _this_ issue more discoverable and, by extension, now also the linked PR, but my preference is always to have the important keywords in the _title_, as an in:title search then allows for a more focused search.

Another datapoint (and workaround): Forcing generation of the entire array up front avoids the problem:

('A'..'B') | ForEach-Object { $_ }  # OK, due to (...)

The output from Trace-Command strongly suggests that this code path is reached before the operator is explicitly invoked when the .. appears as the very first operation in a pipeline:

PS C:\> Trace-Command -Expression {'A'..'B' |ForEach-Object { $_ }} -Name * -Option All -FilePath ($t = [System.IO.Path]::GetTempFileName()) 2>$null; Get-Content $t -TotalCount 2
TypeConversion Information: 0 : Converting to integer.
TypeConversion Information: 0 : Exception converting to integer: "Input string was not in a correct format.".

Why, I'm not entirely certain yet, will keep digging. While this is certainly not the intended behavior of the new [char] overload for .., it doesn't seem to break any previously defined behavior (this is basically the expected behavior for $string..$otherstring prior to https://github.com/PowerShell/PowerShell/pull/5026)

Re: the "nonstandard" name, I took it from the token that represents the underlying range operator :-)

@SteveL-MSFT: Your title edit just made my day, thanks (I wish I were kidding).

@IISResetMe: Fair enough, and perhaps "DotDot operator" is reasonably well-known; my term for it came from Get-Help about_Operators, and I would argue that it's the more sensible name:

Operators should be named for _their purpose_ (only), not their _syntactic form_ (too).

I won't repeat my rant about about the "dot sourcing operator" here.
Although, who's to say? Perhaps it's time for the "asterisk multiplication operator", or the "hyphen-minus subtraction operator", and, last but not least, the "dot-dot range operator".

@IISResetMe - the idea was to name tokens after the syntactic form because it might not make sense if a token was allowed in some new context, e.g. if .. was allowed where it is no longer the range operator.

Was this page helpful?
0 / 5 - 0 ratings