Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: dwwilson66Ответов: 2

У меня есть сценарий 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 не видит его действительным. Или есть что-то еще, что мне не хватает?

output

Ответы

Ответ 1 · рейтинг 6 · CB.

пытаться:

$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())

Ответ 2 · terry

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

$t > c:\path\to\flags.txt

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы