Почему Powershell будет писать в консоль, а не в файл?

У меня есть сценарий PowerShell, который устанавливает флаги на основе различных условий файла. Я буду сокращать для краткости.

$path = "c:\path"
$srcfiles = Get-ChildItem $path -filter *.htm*

ForEach ($doc in $srcfiles) {

$s = $doc.Fullname

Write-Host "Processing :" $doc.FullName

if (stuff) {flag 1 = 1} else {flag 1 = 0}
if (stuff) {flag 1 = 1} else {flag 1 = 0}
if (stuff) {flag 1 = 1} else {flag 1 = 0}

$t = "$s;$flag1;$flag2;$flag2"

Write-Host "Output: " $t

Все это прекрасно работает. Мой файл обрабатывается, флаги установлены правильно, а аккуратная строка с разделителями точками с запятой генерируется как $t. Однако, если я добавлю эти две строки в конце функции,

$stream = [System.IO.StreamWriter] "flags.txt"
$stream.WriteLine $t    

Я получаю эту ошибку.

Unexpected token 't' in expression or statement.
At C:\CGC003a.ps1:53 char:25
+     $stream.WriteLine $t <<<<
    + CategoryInfo          : ParserError: (t:String) [], ParseException
    + FullyQualifiedErrorId : UnexpectedToken

Если я читаю эту запись, кажется, что write-host сбросил мою переменную $t до того, как она попала в WriteLine. Однако, прежде чем я попробую out-file, я хочу понять, что происходит с $t после Write-Host, из-за чего Write Line не видит его действительным. Или есть что-то еще, что мне не хватает?


person dwwilson66    schedule 05.02.2013    source источник


Ответы (2)


пытаться:

$stream.WriteLine($t)   

writeline — это метод объекта streamwriter .net. Чтобы передать значение, вам нужно заключить его в ( )

-если вам нужно добавить к стримеру, вам нужно создать его следующим образом:

$a = new-object 'System.IO.StreamWriter' -ArgumentList "c:\path\to\flags.txt",$true

Где логические аргументы могут быть истинными, чтобы добавить данные в файл, или ложными, чтобы перезаписать файл.

Я предлагаю пройти полный путь для:

$stream = [System.IO.StreamWriter] "c:\path\to\flags.txt"

в противном случае вы создаете файл в текущей папке .net (возможно, c:\windows\system32, если вы запускаете свою текущую консоль powershell от имени администратора, чтобы узнать ее, введите [System.IO.Directory]::GetCurrentDirectory())

person CB.    schedule 05.02.2013
comment
Потрясающий! Это, по крайней мере, вызывает у меня другую ошибку... моя первая запись записывается в файл, затем я получаю ошибки времени выполнения, что она используется другим процессом... что имеет смысл. Есть ли переключатель -force для метода потоковой передачи, который отменит эту блокировку файла? Ему не нравится -append. - person dwwilson66; 05.02.2013
comment
Гм... объект streamwriter должен быть .closed() и, в конечном итоге, .disposed() после использования для разблокировки файла. Если вы перезаписали переменную $stream, вам нужно закрыть powershell и снова открыть, чтобы разблокировать файл. И не запускайте свой страмрайтер в цикле, непосредственно перед циклом, и закрывайте его в конце и вашего скрипта. - person CB.; 05.02.2013
comment
Да, я понимаю насчет .closing файла... но поскольку он повторяется через foreach ($doc), нужно ли мне закрывать его в конце каждой итерации? Я бы подумал, что мне нужно только close файл в КОНЦЕ всех моих итераций... что мне не хватает? - person dwwilson66; 06.02.2013
comment
Вы читали мой предыдущий комментарий? Вы должны закрыть поток, когда вам не нужно записывать больше данных. следить? - person CB.; 06.02.2013
comment
Почему вы используете StreamWriter вместо Out-File? - person Stanley De Boer; 06.02.2013
comment
@C.B. Да, я читал другие комментарии; Я просто просил разъяснений. - person dwwilson66; 06.02.2013
comment
@StanleyDeBoer Я получал другие ошибки с out-file. Он перебирает все записи без отображения ошибок до ФИНАЛЬНОЙ записи, которая возвращает wildcard path does not resolve to a file, и у меня остается пустой файл. Просто попробуй что-нибудь другое. - person dwwilson66; 06.02.2013
comment
@StanleyDeBoer StreamWriter намного быстрее и имеет меньше накладных расходов, чем Out-File. Я работаю над проектом с требованиями к производительности, я провел тесты с обеими реализациями, записывающими 10 000 записей 10 000 раз, и измерял каждое выполнение. В среднем StreamWriter на пару миллисекунд меньше, чем в 3 раза быстрее, чем Out-File. - person Chavez; 03.05.2017

ты мог бы попробовать

$t > c:\path\to\flags.txt
person terry    schedule 05.02.2013
comment
Хотя это определенно работает, это гораздо менее эффективно (и, следовательно, медленнее), чем использование StreamWriter, особенно по сети/удаленному соединению. --- См.: blogs.technet.com/b/gbordier/archive/2009/05/05/ - person CJBS; 01.05.2014