Проблема при записи вывода в файл в Powershell - PullRequest
1 голос
/ 10 июля 2020

впервые задаю вопрос здесь. Я новичок в Powershell и пытаюсь использовать его, чтобы получить время последней записи нескольких файлов с путями, которые я сохранил в файле .txt. Мне нужно сделать это для ~ 9000 файлов CAD, и в настоящее время я практикуюсь. Ниже показано, что у меня получилось, но когда я пытаюсь записать это в файл, возникает ошибка, и я не знаю, как ее исправить.

Вот что у меня работает:

> foreach($line in get-content
> c:\users\jcuthbertson\desktop\filesforgettingdate.txt) {
> if($line -match $regex){
> -join((get-item $line).lastwritetime,",", (get-item $line).name)}}
6/24/2020 11:38:42 AM,Book1.xlsx
6/30/2020 4:16:47 PM,Book2.xlsx
7/10/2020 7:37:31 AM,dwg_vwx_mcd files.xlsx
7/7/2020 9:43:30 AM,Program cleaning flow sequences.xlsx
7/9/2020 8:49:14 AM,vxw paths commas.xlsx

Но когда я добавляю команду "out-file", я получаю сообщение об ошибке и сообщаю, что есть пустой канал

> foreach($line in get-content
> c:\users\jcuthbertson\desktop\filesforgettingdate.txt) {
> if($line -match $regex){
> -join((get-item $line).lastwritetime,",", (get-item $line).name)}} | out-file c:\users\jcuthbertson\desktop\testdatawrite.txt
At line:3 char:68
+ ... get-item $line).lastwritetime,",", (get-item $line).name)}} | out-fil ...
+                                                                 ~
An empty pipe element is not allowed.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : EmptyPipeElement

Любая помощь приветствуется! Спасибо!

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

Это дополнение к AdminOfThings хороший ответ . Если вы новичок в PowerShell, я подумал, что вам может понравиться другой вариант. Вы можете использовать командлет ForEach-Object, который позволяет напрямую использовать конвейер.

$File = 'c:\temp\Test_Input.txt'

Get-Content $File |
ForEach-Object{
    If( $_ -match $RegEx ) {
        $Item = Get-Item $_
        $Item.LastWriteTime, $Item.Name -join ','
    }
} |
Out-File c:\temp\test_output.txt -Append

Может быть, это вопрос предпочтений и обстоятельств, но при использовании конвейера он будет более эффективным с точки зрения памяти. Не поймите меня неправильно, память обычно не является проблемой, но есть разница между сбором объектов заранее либо с помощью подвыражения $(...), либо путем сохранения в переменной. Параметры 2 и 3 в предыдущем ответе сохраняют весь вывод перед записью в файл. Кроме того, вариант 1 из предыдущего ответа - это многократное открытие и закрытие файла.

Также нет необходимости запускать Get-Item несколько раз, поэтому я ввел $Item. Но это можно было бы приспособить в любом примере.

Сообщите мне, если это поможет.

0 голосов
/ 10 июля 2020

Это происходит из-за того, что блок сценария foreach на самом деле ничего не выводит в конвейер. Вывод, поддерживающий конвейер, происходит от оператора -join внутри foreach l oop. Это оставляет вам несколько вариантов для передачи данных в Out-File .

Вариант 1: передать результаты -join в Out-File

foreach($line in get-content c:\users\jcuthbertson\desktop\filesforgettingdate.txt) {
    if($line -match $regex){
        -join ((get-item $line).lastwritetime,",",(get-item $line).name) |
            Out-File c:\users\jcuthbertson\desktop\testdatawrite.txt -Append
    }
}

Обратите внимание на использование переключателя -Append, чтобы не перезаписывать файл при каждой итерации.

Вариант 2: захватить выходные данные в переменной и передать содержимое переменной по конвейеру

$output = foreach($line in get-content c:\users\jcuthbertson\desktop\filesforgettingdate.txt) {
    if($line -match $regex){
        -join ((get-item $line).lastwritetime,",",(get-item $line).name)
    }
}
$output | Out-File c:\users\jcuthbertson\desktop\testdatawrite.txt

Вариант 3. Принудительно преобразовать блок скрипта foreach в выражение, используя подвыражение оператор $()

$(foreach($line in get-content c:\users\jcuthbertson\desktop\filesforgettingdate.txt) {
    if($line -match $regex){
        -join ((get-item $line).lastwritetime,",",(get-item $line).name)
    }
}) | Out-File c:\users\jcuthbertson\desktop\testdatawrite.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...