我正在尝试确定是否设置了某些环境变量(针对postgres环境)。他们通常从PG开始。 (例如PGUSER,PGPASSWORD等)。以下命令输出它。 (前提是我之前设置过)。
gci env:* | sort name | more
为了消除滚动,我尝试了以下操作:
gci env:* | sort name | select-string "PG"
这不会返回任何内容。我在这里错了吗?
编辑:我现在有另一种选择:
gci env:* | sort name | % { $var = $_.Name + ":" + $_.Value; Write-Output $var } | select-string "PG"
必须有更好的选择。
这是一个令人沮丧的问题,几天前我问了一个关于此问题的变体。其他人已经向Microsoft提出了更改此功能的请求(可能是姗姗来迟)。
Select-String
仅处理字符串,而您在上面传递的内容不是字符串,因此它不返回任何内容。显然,您可能会认为,由于Select-String
需要一个字符串,因此会将其隐式更改为字符串,但是没有。因此,接下来要考虑的是将其更改为字符串,但这会造成更多混乱。
gci env:* | sort name | out-string | select-string "PG"
所以现在您只得到everything返回。这里发生的是out-string
作为单个字符串返回all行,因此,如果对“ PG”有任何点击,您将得到全部返回。
[您需要做的是使用out-string -stream
,它通过换行符将字符串分割开,以便每行获得一个字符串,然后才有理输出。
gci env:* | sort name | out-string -stream | select-string "PG"
此处的更多信息:Using PowerShell sls (Select-String) vs grep vs findstr。链接到其中的github请求正在尝试更改功能,以便select-string
在后台隐含一个out-string -stream
,以便您的原始命令可以使用。
您使用的是错误的思维方式。不要像一切都是字符串那样尝试使用PowerShell。那是类Unix的想法,它既可以工作,又可以用螺丝刀拧钉子。您需要切换到面向对象的思维,因为在PowerShell中,您有99%的时间使用对象。
通常,您只需要简单的操作就可以了:
Get-ChildItem Env:PG* | Sort-Object -Property Name
如果Get-ChildItem
支持的glob不起作用,则您想将Where-Object
与-like
运算符一起使用,这类似于Get-ChildItem
可以执行的glob:
Get-ChildItem Env:* | Where-Object Name -like 'PG*' | Sort-Object -Property Name
或者您可以使用-match
运算符,使您可以指定.Net正则表达式:
Get-ChildItem Env:* | Where-Object Name -match '^PG' | Sort-Object -Property Name
或者如果您确切知道要寻找的内容:
$Vars = 'PGUSER', 'PGPASSWORD'
Get-ChildItem Env:* | Where-Object Name -in $Vars | Sort-Object -Property Name
当然,请记住,PowerShell通常不区分大小写。如果需要区分大小写的运算符,则可以指定-clike
,-cmatch
,-cin
等。