【问题标题】:Cannot filter Directories with Powershell using an environment variable无法使用环境变量通过 Powershell 过滤目录
【发布时间】:2020-08-10 16:56:23
【问题描述】:

我在尝试过滤设置在环境变量数组中的目录列表时遇到了意外行为。

当我使用局部变量运行这段代码时,我得到了预期的结果:

$myPath = "C:\temp\"
$myList = 'Folder1', 'Folder2', 'Folder3'
Write-Host "myList: $myList" 
Get-ChildItem -Recurse $myPath | Where-Object { $_.PSIsContainer } | Where-Object { $_.Name -in $myList } | Select-Object FullName

即

myList: Folder1 Folder2 Folder3

FullName
--------
C:\temp\Folder1
C:\temp\Folder2
C:\temp\Folder3

但是,当我用环境变量 $env:yourList 替换 $myList 时

$myPath = "C:\temp\"
$env:yourList = 'Folder1', 'Folder2', 'Folder3'
Write-Host "yourList: $env:yourList"
Get-ChildItem -Recurse $myPath | Where-Object { $_.PSIsContainer } | Where-Object { $_.Name -in $env:yourList } | Select-Object FullName

Get-ChildItem 的结果为空

yourList: Folder1 Folder2 Folder3
.

从上面的输出中可以看出,$env:yourList 中设置的值与$myList 中设置的值相同,所以 环境变量 有什么特别之处可以处理它们Where-Object 标准有什么不同?

顺便说一句,使用-Include 而不是Where-Object 时会发生相同的行为,即:

Get-ChildItem -Path $myPath -Recurse -Include $env:yourList -Directory

【问题讨论】:

    标签: powershell environment-variables get-childitem


    【解决方案1】:

    环境变量始终是单个字符串,因此您不能在其中存储数组(或任何[string] 以外的其他数据类型)。

    • 注意:这不在 PowerShell 的控制范围内:环境变量是系统级功能。

    PowerShell stringifying assignment[1] 上的输入数组,这意味着使用空格作为分隔符连接数组元素(或者,如果已定义,则分隔符存储在首选项变量 $OFS) 中,这就是数组 'Folder1', 'Folder2', 'Folder3' 变成单个字符串的原因
    'Folder1 Folder2 Folder3'。


    如果您确实需要一个 environment 变量来存储您的数组 - 通常只需要将值传递给 子进程 - 您必须选择一个-assignment 上的字符串表示形式,您可以在 reading 变量时将其重新转换为数组;例如:

    # Assuming the array elements contain no newlines, use newlines
    # to separate them.
    $env:yourList = ('Folder1', 'Folder2', 'Folder3') -join "`n"
    
    # Later, re-convert the single-string representation to an array.
    $env:yourList -split "`n"
    

    [1] 正如Doug Maurer 指出的那样,这种自动到字符串的转换发生在任何不属于[string]类型的RHS上,例如$env:yourList = 42(分配字符串'42')。换句话说:您分配给环境变量的任何内容都会自动转换为(单个)字符串。

    【讨论】:

    • 即使你尝试$env:yourList = [int]1你也不会得到错误但类型仍然是$env:yourList.gettype().name StringBig fan mklement0
    • 确实,@DougMaurer - PowerShell 愉快地自动将任何数据类型转换为 [string],所有环境变量都被隐式键入。感谢您的反馈。
    • 谢谢,很有意义,我必须使用环境变量,因为这是 Azure DevOps 管道中的 ps 脚本,我需要在管道变量中设置列表。
    猜你喜欢
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2011-01-14
    相关资源
    最近更新 更多