Другой альтернативой является создание полноценного модуля PowerShell. Вот быстрый способ сделать это:
Microsoft.PowerShell.5.ReferenceAssemblies
Класс My Greeting:
public class GreetingClass
{
public string Greeting { get; set; }
public string ToWhom { get; set; }
}
System.Management.Automation.Cmdlet
и поставляется с несколькими атрибутами PowerShell: [ 1128] Вот мое:
[Cmdlet(VerbsCommon.New, "Greeting")]
[OutputType(typeof(GreetingClass))]
public class NewGreeting : Cmdlet
{
[Parameter(Mandatory = true)]
public string Greeting { get; set; }
[Parameter]
[Alias("Who")]
public string ToWhom { get; set; } = "World";
protected override void ProcessRecord()
{
base.ProcessRecord();
WriteVerbose("Creating and returning the Greeting Object");
var greeting = new GreetingClass {Greeting = Greeting, ToWhom = ToWhom};
WriteObject(greeting);
}
}
Debug
и установите: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
-noprofile -noexit -command "import-module .\yourProjectName.dll
Теперь нажмите F5
. Появится консоль PowerShell. Поскольку вы импортировали свой модуль, командлет New-Greeting
загружен. Итак, все это работает:
PS C:\> New-Greeting -Greeting "hello there" -ToWhom World
, что приводит к:
Greeting ToWhom
-------- ------
hello there World
Но ваш командлет является полноценным командлетом PowerShell, поэтому он может попасть в конвейер. Это:
PS C:\> New-Greeting -Greeting "What's new" -ToWhom Pussycat | Format-List
приведет к:
Greeting : What's new
ToWhom : Pussycat
Поскольку вы запускаете сеанс PowerShell, когда нажимаете F5
и загружаете свой модуль, вы можете установить точки останова в своем коде, одношаговый и т. д. в отладчике.
Вы получаете все обычное совершенство PowerShell. Вы можете использовать -Who
как псевдоним для -ToWhom
. Параметр -Greeting
описывается как обязательный, поэтому, если вы его забудете, консоль предложит вам.
Вы также можете предоставлять методы в своем классе POCO. Например, если вы добавите этот метод в GreetingClass
:
public void SayHello()
{
Console.WriteLine($"{Greeting} {ToWhom}");
}
Вы можете сделать это в PowerShell:
PS C:\> $greet = New-Greeting -Greeting Hello -Who World
PS C:\> $greet.SayHello()
и получить в результате:
[ 118]
Я многому научился из этого: https://www.red-gate.com/simple-talk/dotnet/net-development/using-c-to-create-powershell-cmdlets- the-basics /
Вы автоматически получаете базовую помощь Get-Help
из PowerShell, но если вы будете следовать демонстрациям Red-Gate (по ссылке выше), вы узнаете, как разбогатеть Get-Help
Справка из стандартных комментариев C # XML (из пакета XmlDoc2CmdletDoc
NuGet).
Не тратьте зря время, вы можете использовать плагин Resource Bundle в Eclipse
Это не проблема с Eclipse. Если вы используете класс Properties для чтения и сохранения файла свойств, класс будет экранировать все специальные символы.
При сохранении свойств в поток или их загрузке из потока, ISO 8859 Используется кодировка -1 символов. Для символов, которые не могут быть напрямую представлены в этой кодировке, используются escape-символы Unicode; однако в escape-последовательности допускается только один символ «u». Инструмент native2ascii можно использовать для преобразования файлов свойств в другие кодировки символов и обратно.
Символы меньше \ u0020 и символы больше \ u007E записываются как \ uxxxx для соответствующего шестнадцатеричного значения xxxx.
В описываемом вами процессе слишком много точек, где могут возникнуть ошибки, поэтому я не буду пытаться угадывать, что вы делаете не так, но я думаю, что знаю, что происходит под капотом .
EF BF BD
- это кодированная в UTF-8 форма U + FFFD
, стандартный заменяющий символ, который вставляется декодерами при обнаружении искаженного ввода. Похоже, ваш текст сохраняется как ISO-8859-1, затем читается как UTF-8, затем сохраняется как UTF-8, а затем конвертируется в формат свойств с использованием native2ascii
с использованием платформы по умолчанию. кодировка (например, windows-1252).
ü => 0xFC // save as ISO-8859-1 0xFC => U+FFFD // read as UTF-8 U+FFFD => 0xEF 0xBF 0xBD // save as UTF-8 0xEF 0xBF 0xBD => \u00EF\u00BF\u00BD // native2ascii
Я предлагаю вам оставить свойство "file.encoding" в покое. Подобно "file.separator" и "line.separator", это далеко не так полезно, как вы ожидали бы. Вместо,
Файлы свойств по определению являются ISO-8859-1 - см. Документацию по классу Properties .
Spring имеет замену, которая может загружаться с указанной кодировкой, с использованием PropertiesFactoryBean
.
РЕДАКТИРОВАТЬ: Как отметил в комментариях Лоуренс, Java 1.6 представила перегрузки для load
и store
, которые используют Reader
] / Автор
. Это означает, что вы можете создать программу чтения для файла с любой кодировкой, которую хотите, и передать его в load
. К сожалению, FileReader
по-прежнему не позволяет вам указать кодировку в конструкторе (aargh), поэтому вы застрянете в цепочке FileInputStream
и InputStreamReader
вместе , Однако это сработает.
Например, для чтения файла с использованием UTF-8:
Properties properties = new Properties();
InputStream inputStream = new FileInputStream("path/to/file");
try {
Reader reader = new InputStreamReader(inputStream, "UTF-8");
try {
properties.load(reader);
} finally {
reader.close();
}
} finally {
inputStream.close();
}
Кажется, это работает только для некоторых символов ... включая специальные символы для немецкого, португальского и французского языков. Однако у меня возникли проблемы с русскими, хинди и мандаринскими символами. Они не преобразуются в формат свойств native2ascii, вместо этого сохраняются с помощью ?? ?? ??
Единственный способ заставить мое приложение правильно отображать эти символы - это поместить их в файл свойств, переведенный в формат UTF-8 - как \ u0915 вместо क или \ u044F вместо я.
Есть какие-нибудь советы?
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");
props.load(new InputStreamReader(resource.openStream(), "UTF8"));
Работает как шарм
: -)