我正在开发一个需要以2种语言提供的PowerShell脚本。为了让我的生活更轻松,我觉得为每个人创建一个语言文件似乎是一个好主意,并在其中包含字符串,而不是直接在代码中保存文本并维护代码的2个副本。有关如何实现这一点的最佳实践吗?
我现在遇到的障碍是某些字符串需要包含变量,因此我已经遇到了一些问题。我注意到它会在设置字符串时使用变量的值,这对我来说很有意义。
例如,如果我有一个输出错误级别的字符串:
$Strings.ErrorMessage = "Error detected with $Level severity"
然后将$Level
设置为任何值,在调用脚本时它不会具有该值。假设在设置$Level
之前未设置$Strings.ErrorMessage
,输出将如下所示:
Error detected at severity
有没有办法告诉PowerShell在输出之前获取$ Level变量的当前值?
答案 0 :(得分:3)
在最佳实践方面,PowerShell自己的帮助系统有一个页面:
Get-Help about_Script_Internationalization
为避免在本地化字符串中扩展变量时出现问题,可以使用格式字符串运算符:
'Error detected with {0} severity' -f $Level
答案 1 :(得分:2)
请参阅about_Script_Internationalization和this link上的此链接,该示例提供了一个示例:
本地化之前PSUICultureExample.ps1
[System.Windows.Forms.MessageBox]::Show(
"This is a small example showing how to localize strings in a PowerShell script.",
"Hello, World!") | Out-Null
创建两个本地化脚本的代码。
<强>本地化\ PSUICultureExample.psd1 强>
ConvertFrom-StringData @"
MessageTitle = Hello, World!
MessageBody = This is a small example showing how to localize strings in a PowerShell script.
OtherMessage = Hello {0}!
"@
<强>本地化\ ES-ES \ PSUICulture.psd1 强>
ConvertFrom-StringData @"
MessageTitle = ¡Hola mundo!
MessageBody = Este es un pequeño ejemplo que muestra cómo localizar cadenas en un script de PowerShell.
OtherMessage = ¡Hola {0}!
"@
PSUICultureExample.ps1 本地化后
$s = Import-LocalizedData -BaseDirectory (Join-Path -Path $PSScriptRoot -ChildPath Localized)
[System.Windows.Forms.MessageBox]::Show($s.MessageBody, $s.MessageTitle) | Out-Null
然后要在字符串中包含值(插值),你可以这样做:
$ValueToInsert = 'Bob'
$s.OtherMessage -f $ValueToInsert
<强> 修改 强>
文件夹Localized
&amp; Localized\es-ES
与脚本相关。