2015-05-08 2 views
0

У меня есть сценарий PS для копирования относительных путей всех файлов в папке в текстовый файл.
Перенаправление вывода Powershell Кодирование Выпуск

(gci -path Passion_Flower_positive_images -recurse *.jpg|Resolve-path -relative) -replace "\\","/" -replace "[.]/","" > Passion_Flower_positive_images_txt.txt 

После выполнения этой команды я проверил выход, это казалось нормальным. Итак, я продолжил процедуру, которая взяла этот файл в качестве входных данных. Как только я запустил процедуру в cmd, она отобразила некоторые «странные» символы, что привело к полному сбою и неопределенному поведению.

Мне потребовалось много времени, чтобы понять это. Я запускал вручную ту же самую процедуру, используя unix-импорт find.exe и заменяя все символы-разделители пути от '\' до '/' и EOL до CR-LF-истощал немного, но он работал в прошлом.

Теперь, я взял вывод команды GCI (который не работал) и сделал «Advanced сохранить параметры» в VS2013, чтобы изменить кодировку (который я нашел, чтобы быть Unicode) из Unicode в евроокон -1252. Теперь я подал один и тот же файл на процедуру, и он сработал!

Я искал различные решения по умолчанию для кодировки Ascii. Я прочитал одно решение и сделал это:

(gci -path Passion_Flower_positive_images -recurse *.jpg|Resolve-path -relative) -replace "\\","/" -replace "[.]/","" | out-file -path Passion_Flower_positive_images_txt.txt -encoding ascii 

Но в конечном итоге в какой-то ошибки, которые я не мог видеть, как она вышла.

Тогда я напечатал следующее:

PS C:\> $OutputEncoding 

я получил:
PS F: _102flowers-500x500> $ OutputEncoding

IsSingleByte  : True 
BodyName   : IBM437 
EncodingName  : OEM United States 
HeaderName  : IBM437 
WebName   : IBM437 
WindowsCodePage : 1252 
IsBrowserDisplay : False 
IsBrowserSave  : False 
IsMailNewsDisplay : False 
IsMailNewsSave : False 
EncoderFallback : System.Text.InternalEncoderBestFitFallback 
DecoderFallback : System.Text.InternalDecoderBestFitFallback 
IsReadOnly  : True 
CodePage   : 437 

Это, однако, заставляет меня задаться вопросом, если кодировка по умолчанию, указанная здесь WindowsCodePage : 1252 действительно, почему ручное изменение работает и действительно ли нужно изменить кодировку? Как мне это достичь?

+0

Вместо использования 'Out-File' вы также можете использовать' Set-Content', который по умолчанию соответствует ascii. – Matt

+0

@Matt: Lemme попробуйте это. –

+0

Это также зависит от программы вывода, ожидающей кодирования ascii. – Matt

ответ

0

Переменная $OutputEncoding по умолчанию установлена ​​в ASCII. Чтобы получить желаемый результат, вы можете изменить кодировку на $OutputEncoding = [Console]::OutputEncoding.

Смежные вопросы