4 ms·
Ok, that sounds good. But what if some developer decided that some field would have prefix "ABC" in all values, then the value I am interested in, then some val
by amenod 10y ago
Ok, that sounds good. But what if some developer decided that some field would have prefix "ABC" in all values, then the value I am interested in, then some value I am not interested in at the end? (you say this can't happen? Clue: WMI.) Can I take the value, convert it to string, make some magic on it and convert it to another object entirely?
I don't know, I never had any problems with text parsing. I love strong types in programming languages, but in system administration I think it would only get in the way. But as I said, never tried it, so I might be missing something.
- ZenoArrow 10y ago> "But what if some developer decided that some field would have prefix "ABC" in all values, then the value I am interested in, then some value I am not interested in at the end?" I don't see why this would be a problem for PowerShell. Just use Select-String to strip away the characters you're not interested in. The advantages that derive from passing around objects aren't based on all data being automatically in the format you want.
- CodexArcanum 10y agoYep! There's a few ways to accomplish such a thing, but probably the most straight forward would be the Foreach-Object command (aliased as "%") to do a mapping from source object to something else. Free form objects/dictionaries are easy to make and consume.
- new_hackers 10y agoSelect-Object also makes it very, very easy to make new objects
- dsp1234 10y agoThere are many ways to accomplish this (in general). My favorite is that you can create 'computed' properties on the fly which means you can continue to keep the strongly typed object in the pipeline, and still have access to the data you care about. https://technet.microsoft.com/en-us/library/ff730948.aspx https://technet.microsoft.com/en-us/library/ff730948.aspx You use the exact same functions (first, last, substring, replace, etc) as you would normally. Then the rest of the pipeline has it available if needed.
- jocro 10y agoI spend about half my job inside Powershell and had no idea bout this. Very cool.
- zamalek 10y agoThe default regex functionality is absolutely terrible (maybe this can now be fixed with a PR). You'd write your own cmdlet[1]. A few things are demonstrated in the cmdlet: functions that take pipes, functions that return pipes, anonymous functions, actions to perform before processing a pipe and dynamic objects. The Powershell syntax gets ridiculed for being ugly, but it's beautifully expressive. > Can I take the value, convert it to string, make some magic on it and convert it to another object entirely? Get-ChildItem *.js | Get-Content | Select-Regex 'require\("(?<Require>.*?)"\)' | Select-Object -ExpandProperty Require In other words: find JS files | read lines | turn regex capture groups into an object (another object entirely) | select a single capture Ultimately, Microsoft provides WMI cmdlets[2]. You'd have strong types from the get-go and wouldn't need resort to this string silliness. [1]: https://gist.github.com/jcdickinson/cee4582448300c0d404bbff1f5669029 https://gist.github.com/jcdickinson/cee4582448300c0d404bbff1... [2]: https://technet.microsoft.com/en-us/library/ee176860.aspx https://technet.microsoft.com/en-us/library/ee176860.aspx
- jodrellblank 10y agoThe default regex functionality is absolutely terrible How so?
- zamalek 10y agoReplicate the above without using [Regex]:: (i.e. use -matches and $matches). It forces you to radically depart from a typical Powershell mindset and approach.
- jodrellblank 10y agoI'm not certain what you're getting at; -match doesn't handle multiple matches so you can't replicate the above just with it? Yes, that's a bit annoying. You could match line by line: gci *.js | foreach { gc $_ | foreach { if ($_ -match ..) { $Matches... which is ugly, but doesn't use [regex]::Matches. But you can do: sls 'require\("(.*?)"\)' *.js | select { $_.Matches.groups[1] } or other variants of Select-String, depending on exactly what data you want, without departing into the .Net Framework too far.