我使用powershell创建一个JSON文件,并使用JSON文件作为chef-runtime属性。
创建JSON文件的代码(在powershell中)
New-Item $ATTRIBUTESFILE -ItemType file
$jsonInput = @{param1=@{subparam=$attribute}}
$ATTRIBUTE = $jsonInput | ConvertTo-Json
$ATTRIBUTE | Out-File $ATTRIBUTESFILE
致电厨师客户的代码
chef-client -o 'recipe[cookbook]' -j $ATTRIBUTESFILE
错误消息
c:/chef/embedded/lib/ruby/gems/1.9.1/gems/yajl-ruby-1.1.0-x86-mingw32/lib/yajl.rb:36:in `parse': lexical error:
invalid char in json text. (Yajl::ParseError)
ÿ_{ (right here) ------^
from c:/chef/embedded/lib/ruby/gems/1.9.1/gems/yajl-ruby-1.1.0-x86-mingw32/lib/yajl.rb:36:in `parse'
from c:/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/json_compat.rb:56:in `from_json'
当我手动创建相同的文件时,它不会出现词汇错误。 任何有关这方面的帮助将不胜感激。
答案 0 :(得分:1)
Add -Encoding UTF8
to the Out-File
. That's probably a UTF-16 byte order mark.
答案 1 :(得分:1)
默认情况下,Windows PowerShell会创建带有Out-File
和>
的UTF-16LE编码文件(带有BOM)。 [1]
相比之下,根据coderanger,Chef需要没有BOM的UTF-8编码文件。
不幸的是,使用-Encoding UTF8
总是在Windows PowerShell中使用 BOM创建UTF-8文件。解决方案是直接使用.NET框架:
[System.IO.File]::WriteAllText($ATTRIBUTESFILE.FullName, $ATTRIBUTE)
请参阅我的this answer以获得便利功能,该功能可生成无BOM的UTF-8文件,其语法类似于Out-File
。
[1]在PowerShell Core 中,没有BOM的UTF-8现在是默认编码。