Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过正确的自动完成(IntelliSense)将JSON强制转换为PowerShell_Json_Powershell_Visual Studio Code - Fatal编程技术网

通过正确的自动完成(IntelliSense)将JSON强制转换为PowerShell

通过正确的自动完成(IntelliSense)将JSON强制转换为PowerShell,json,powershell,visual-studio-code,Json,Powershell,Visual Studio Code,当我读取json文件并将其转换为PowerShell时,是否有办法使Visual Studio代码中的IntelliSense自动完成正常工作,如: $config = Get-Content "SOME_PATH" | ConvertFrom-Json $config.attribute1 问题是,文件需要先存储在内存中,然后才能从json文件中获取结构并提出属性 如果我取出代码并在powershell终端中执行,然后返回到代码编辑器,则自动完成工作正常。目前IntelliSense不这样

当我读取json文件并将其转换为PowerShell时,是否有办法使Visual Studio代码中的IntelliSense自动完成正常工作,如:

$config = Get-Content "SOME_PATH" | ConvertFrom-Json
$config.attribute1 
问题是,文件需要先存储在内存中,然后才能从json文件中获取结构并提出属性


如果我取出代码并在powershell终端中执行,然后返回到代码编辑器,则自动完成工作正常。

目前IntelliSense不这样做

其中一些原因是因为在编码时,通常指定的文件不存在,测试版本与预期不同,文件可能很大,格式不正确,等等。默认情况下,不这样做有时更安全

通过在终端中运行它并将其加载到内存中,您可以显式地告诉IntelliSense您正在使用什么,然后它现在就知道了该对象,并且可以正确地建议正确的属性和属性


正如@mklement0所建议的,使用键盘快捷键F8将方便地在集成终端中执行当前行/选择,这将把对象加载到内存中,并允许您在编辑器中使用IntelliSense。

当前IntelliSense不这样做

其中一些原因是因为在编码时,通常指定的文件不存在,测试版本与预期不同,文件可能很大,格式不正确,等等。默认情况下,不这样做有时更安全

通过在终端中运行它并将其加载到内存中,您可以显式地告诉IntelliSense您正在使用什么,然后它现在就知道了该对象,并且可以正确地建议正确的属性和属性

正如@mklement0所建议的,使用键盘快捷键F8将方便地在集成终端中执行当前行/选择,这将把对象加载到内存中,并允许您在编辑器中使用IntelliSense。

补充:

第一,一些背景资料;在底部找到一个可行的解决方案

Visual Studio代码中变量的IntelliSense如果其类型为:

显式声明,例如,[datetime]$var=。。。 或者可以从指定的值推断。 如果分配基于命令cmdlet、函数、脚本调用,则只能从具有明确定义的输出类型的命令推断类型:

许多cmdlet(但并非所有cmdlet)确实声明了其输出类型 函数和脚本必须使用[OutputType]属性。 此外,ConvertFrom Json返回的不起眼的[pscustomobject]类型没有固有属性,只有您根据需要添加的属性;财产袋-您只能获得IntelliSense:

如果变量是从自定义对象文本赋值的,例如,$var=[pscustomobject]@{one=1;two=2} 如果将自定义对象强制转换为特定类型,则假定可以从自定义对象的属性构造该类型的实例,这是PowerShell易于看到的。 使用自定义类PSv5的解决方案+ Visual Studio代码的IntelliSense通过PowerShell扩展识别通过PSv5+定义的PS自定义类实例的成员

因此,您可以使用自定义类来镜像正在加载的JSON对象的结构,并通过强制转换将ConvertFrom JSON返回的[pscustomobject]属性包转换为该类的实例

注意:这种方法的固有局限性是,您的类必须预期底层JSON对象包含的所有属性名,并且两者必须保持同步;否则:

如果JSON端的属性名称发生更改,如果类定义没有相应更新,代码将中断。 如果在JSON端添加新属性,则除非相应地更新类定义,否则这些属性将无法访问。 类定义可以是:

直接嵌入脚本中 通过导入模块导入。请注意,使用导入模块不会加载模块的类。 要实现手头的解决方案,可以通过以下两种方式之一使用类定义:

a直接在脚本中定义一个与JSON对象结构匹配的类,并将ConvertFrom JSON返回的[pscustomobject]实例转换为该类型;以这种方式分配的变量支持IntelliSense

b将JSON加载功能包装在模块内执行上述操作的模块中,并将类实例从声明其[OutputObject]为该类型的函数中传递出去;使用using module导入该模块的代码将获得捕获该函数输出的变量的IntelliSense

一个简单的示例:

# Define a class whose properties mirror the underlying JSON.
class Config {
  $foo
  $bar
}

# Load the JSON and cast the resulting [pscustomobject] to the class.
# Note: This cast only works if the JSON object's set of properties 
#       is either the same as that of the [Config] type or a subset of it.
[Config] $config = '{ "foo": "bar", "bar": 42 }' | ConvertFrom-Json

# Variable $config supports IntelliSense, because its is now known
# as type Config.
$config. # shows list of properties
补充:

第一,一些背景资料;在底部找到一个可行的解决方案

Visual Studio代码中变量的IntelliSense如果其类型为:

明确地 例如,[datetime]$var=。。。 或者可以从指定的值推断。 如果分配基于命令cmdlet、函数、脚本调用,则只能从具有明确定义的输出类型的命令推断类型:

许多cmdlet(但并非所有cmdlet)确实声明了其输出类型 函数和脚本必须使用[OutputType]属性。 此外,ConvertFrom Json返回的不起眼的[pscustomobject]类型没有固有属性,只有您根据需要添加的属性;财产袋-您只能获得IntelliSense:

如果变量是从自定义对象文本赋值的,例如,$var=[pscustomobject]@{one=1;two=2} 如果将自定义对象强制转换为特定类型,则假定可以从自定义对象的属性构造该类型的实例,这是PowerShell易于看到的。 使用自定义类PSv5的解决方案+ Visual Studio代码的IntelliSense通过PowerShell扩展识别通过PSv5+定义的PS自定义类实例的成员

因此,您可以使用自定义类来镜像正在加载的JSON对象的结构,并通过强制转换将ConvertFrom JSON返回的[pscustomobject]属性包转换为该类的实例

注意:这种方法的固有局限性是,您的类必须预期底层JSON对象包含的所有属性名,并且两者必须保持同步;否则:

如果JSON端的属性名称发生更改,如果类定义没有相应更新,代码将中断。 如果在JSON端添加新属性,则除非相应地更新类定义,否则这些属性将无法访问。 类定义可以是:

直接嵌入脚本中 通过导入模块导入。请注意,使用导入模块不会加载模块的类。 要实现手头的解决方案,可以通过以下两种方式之一使用类定义:

a直接在脚本中定义一个与JSON对象结构匹配的类,并将ConvertFrom JSON返回的[pscustomobject]实例转换为该类型;以这种方式分配的变量支持IntelliSense

b将JSON加载功能包装在模块内执行上述操作的模块中,并将类实例从声明其[OutputObject]为该类型的函数中传递出去;使用using module导入该模块的代码将获得捕获该函数输出的变量的IntelliSense

一个简单的示例:

# Define a class whose properties mirror the underlying JSON.
class Config {
  $foo
  $bar
}

# Load the JSON and cast the resulting [pscustomobject] to the class.
# Note: This cast only works if the JSON object's set of properties 
#       is either the same as that of the [Config] type or a subset of it.
[Config] $config = '{ "foo": "bar", "bar": 42 }' | ConvertFrom-Json

# Variable $config supports IntelliSense, because its is now known
# as type Config.
$config. # shows list of properties

这非常不方便,因为我想将配置文件加载到PowerShell模块中的PowerShell对象中,然后将其返回以供使用。模块的调用者现在需要知道JSON文件的结构,或者使用F8调用Get Config,然后继续编写依赖于该配置对象的代码。这非常不方便,因为我想将配置文件加载到PowerShell模块中的PowerShell对象中,然后返回以供使用。模块的调用者现在需要知道JSON文件的结构,或者使用F8调用Get Config,然后继续编写依赖于该Config对象的代码。非常感谢您花费时间,但是我知道类方法,但是维护配置文件和类定义不是一个选项,因为我更喜欢被强制要检查配置文件,只需在一个位置添加/删除配置,而不是将这些配置与源代码保持同步。理解和理解,@nailuenlue,但我不确定是否有好的解决方案。最接近您想要的是让一些定期运行或监视配置文件更改的外部进程从JSON重新创建一个类定义,并将其修补到模块源代码中;一个简单的示例:类Config{$Get Content some.json | ConvertFrom json[0].ForEach{$\.psobject.properties.name}-replace'^','$'-replace'$','n}非常感谢您花费时间,但我知道类的方法,但维护配置文件和类定义不是一个选项,因为我更喜欢在单个位置检查配置文件以添加/删除配置,而不是保持这些源的同步。理解和理解,@nailuenlue,但我不确定有没有好的解决办法。最接近您想要的是让一些定期运行或监视配置文件更改的外部进程从JSON重新创建一个类定义,并将其修补到模块源代码中;一个简单的示例:类Config{$Get Content some.json | ConvertFrom json[0].ForEach{$\.psobject.properties.name}-replace'^','$'-replace'$','n}