从另一个powershell脚本调用powershell脚本并保证它是UTF8

从另一个powershell脚本调用powershell脚本并保证它是UTF8,powershell,azure,encoding,utf-8,azure-powershell,Powershell,Azure,Encoding,Utf 8,Azure Powershell,我组装了一个Powershell脚本,该脚本旨在获取托管在Azure Blob上的其他脚本,并执行它们 相关代码块: 获取脚本: $resp = (Invoke-WebRequest -Uri $scriptUri -Method GET -ContentType "application/octet-stream;charset=utf-8") $migrationScript = [system.Text.Encoding]::UTF8.GetString($resp.RawContentS

我组装了一个Powershell脚本,该脚本旨在获取托管在Azure Blob上的其他脚本,并执行它们

相关代码块:

获取脚本:

$resp = (Invoke-WebRequest -Uri $scriptUri -Method GET -ContentType "application/octet-stream;charset=utf-8")
$migrationScript = [system.Text.Encoding]::UTF8.GetString($resp.RawContentStream.ToArray());
$tempPath = Get-ScriptDirectory
$fileLocation = CreateTempFile $tempPath "migrationScript.ps1" $migrationScript
创建文件:

$newFile = "$tempFolder"+"\"+"$fileName"
Write-Host "Creating temporary file $newFile"
[System.IO.File]::WriteAllText($newFile, $fileContents)
然后我用

Invoke-Expression "& `"$fileLocation`" $migrationArgs"
对于我所需要的,这很有效。但是,调用表达式没有正确读取文件的编码。它可以在记事本或记事本++中正确打开,但不能在ISE中打开(我现在正在执行脚本)

有没有办法确保脚本被正确读取?有必要支持UTF8,因为脚本可能需要执行操作,例如将AppSetting设置为包含特殊字符的值


编辑:在“香草”非ISE Powershell调用上的行为相同。

根据@lit和@PetSerAI,Powershell需要BOM才能正常工作

我的第一次尝试没有成功,因此我切换回非BOM,但通过以下步骤,它成功了:

  • 使用
    -ContentType“application/octet stream;charset=utf-8”执行Invoke-WebRequest

  • 抓取原始内容(您将在Powershell中看到它是一系列数字,我假设是ascii码?)并使用
    [system.Text.Encoding]:UTF8.GetString($resp.RawContentStream.ToArray())转换其字节
    到包含所需字符的数组

  • 通过.NET的WriteAllText保存文件时,请确保使用UTF8,
    
    [System.IO.File]::writealText($newFile,$fileContents,[System.Text.Encoding]::UTF8)
    。在本例中,UTF8被理解为带有字节顺序标记的UTF8,这是Powershell所需要的


  • 根据@lit和@PetSerAI,Powershell需要BOM才能正常工作

    我的第一次尝试没有成功,因此我切换回非BOM,但通过以下步骤,它成功了:

  • 使用
    -ContentType“application/octet stream;charset=utf-8”执行Invoke-WebRequest

  • 抓取原始内容(您将在Powershell中看到它是一系列数字,我假设是ascii码?)并使用
    [system.Text.Encoding]:UTF8.GetString($resp.RawContentStream.ToArray())转换其字节
    到包含所需字符的数组

  • 通过.NET的WriteAllText保存文件时,请确保使用UTF8,
    
    [System.IO.File]::writealText($newFile,$fileContents,[System.Text.Encoding]::UTF8)
    。在本例中,UTF8被理解为带有字节顺序标记的UTF8,这是Powershell所需要的


  • 脚本在文件开头是否有UTF-8的Unicode BOM?1)
    Invoke Expression
    与文件读取无关,它仅将字符串作为PowerShell代码调用。2) 文件必须包含BOM,PowerShell才能识别UTF-8。3) 字符串可以作为PowerShell代码调用,而无需将其保存到临时文件。不,即使在notepad++@PetSerAl中显示所有字符,它们也不会显示BOM,我将研究如何将字符串作为代码调用,谢谢。脚本在文件开头是否有UTF-8的Unicode BOM?1)
    调用表达式
    与文件读取无关,它仅将字符串作为PowerShell代码调用。2) 文件必须包含BOM,PowerShell才能识别UTF-8。3) 字符串可以作为PowerShell代码调用,而无需将其保存到临时文件中。不,即使在notepad++@PetSerAl中显示所有字符,它们也不会显示BOM。我将研究如何将字符串作为代码调用,谢谢。对于步骤3,您应使用
    设置内容-编码UTF8
    ,这将在PowerShell中更通用。对于步骤3,您应该使用
    设置内容-编码UTF8
    ,这将在PowerShell中更通用