создать индекс файла вручную с помощью powershell, с разделителями табуляции - PullRequest
0 голосов
/ 07 мая 2020

Заранее извините за, вероятно, тривиальный вопрос, я новичок в PowerShell, пожалуйста, подождите и дайте мне совет, как поправиться.

Я хочу получить индекс файла index.txt, который содержит список всех файлов в текущем каталоге и подкаталогах в следующем формате:

./dir1/file1.txt   07.05.2020 16:16   1959281

где

  1. перечисленные каталоги являются относительными (т.е. это будет запускаться удаленно и для экономии места, относительный путь достаточно хорош)
  2. разделитель - табуляция \t
  3. формат даты day.month.fullyear hours:minutes:seconds, последняя запись (это случай для меня, но я предполагаю это будет отличаться от системных настроек и должно быть выполнено)
  4. (последнее число - размер в байтах)

Я почти добираюсь до этого с помощью этой команды в PowerShell (возможно, это полезно кому-то еще):

 get-childitem . -recurse  | select fullname,LastWriteTime,Length | Out-File index.txt

с этим результатом

FullName                                     LastWriteTime       Length
--------                                     -------------       ------
C:\Users\user1\Downloads\test\asdf.txt       07.05.2020 16:19:29   1490
C:\Users\user1\Downloads\test\dirtree.txt    07.05.2020 16:08:44      0
C:\Users\user1\Downloads\test\index.txt      07.05.2020 16:29:01      0
C:\Users\user1\Downloads\test\test.txt       07.05.2020 16:01:23    814
C:\Users\user1\Downloads\test\text2.txt      07.05.2020 15:55:45   1346

Итак, остаются вопросы: как ...

  1. получить избавиться от заголовков?
  2. применить этот формат даты?
  3. разделитель табуляции e очень что-то?
  4. получить контроль над тем, какой символ новой строки используется (\n или \r или оба)?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Другой подход может заключаться в следующем:

$StartDirectory = Get-Location
Get-ChildItem -Path $StartDirectory -recurse | 
    Select-Object -Property @{Name='RelPath';Expression={$_.FullName.toString() -replace [REGEX]::Escape($StartDirectory.ToString()),'.'}},
                            @{Name='LastWriteTime';Expression={$_.LastWriteTime.toString('dd.MM.yyyy HH:mm:ss')}},
                            Length | 
                                Export-Csv -Path Result.csv -NoTypeInformation -Delimiter "`t"

Я рекомендую использовать правильные файлы CSV, если у вас есть такие структурированные данные. Полученный файл CSV будет сохранен в текущем рабочем каталоге.

1 голос
/ 07 мая 2020

Если путь, из которого вы запускаете это, НЕ является текущим путем сценария, выполните:

$path = 'D:\Downloads' # 'X:\SomeFolder\SomeWhere'
Set-Location $path

сначала.

Затем это должно сделать это:

Get-ChildItem . -Recurse -File  | ForEach-Object {
    "{0}`t{1:dd.MM.yyyy HH:mm}`t{2}" -f ($_ | Resolve-Path -Relative), $_.LastWriteTime, $_.Length
} | Out-File 'index.txt'

На Windows новая строка будет \r\n (CRLF)

Если вы хотите контролировать это, это должно быть:

$newline = "`n"   # for example
# capture the lines as string array in variable $lines
$lines = Get-ChildItem . -Recurse -File  | ForEach-Object {
    "{0}`t{1:dd.MM.yyyy HH:mm}`t{2}" -f ($_ | Resolve-Path -Relative), $_.LastWriteTime, $_.Length
}
# join the array with the chosen newline and save to file
$lines -join $newline | Out-File 'index.txt' -NoNewline

Потому что ваше требование НЕ иметь заголовков столбцов в выходном файле, я использую здесь Out-File вместо Export-Csv

...