Как я могу удалить символы из строки в текстовом файле без переименования файла? - PullRequest
0 голосов
/ 27 сентября 2019

Я хочу иметь возможность взять файл в папку и записать его в текстовый файл в пакетном режиме или PowerShell.Выходные данные в текстовом файле должны иметь FileName, NewFileName, DateModified.FileName - это то, что файл был назван, прежде чем он был включен в программу и вывод.NewFileName - это имя файла, который был выведен из программы и сохранен в выходной папке.

Приведенный ниже скрипт PowerShell - это то, что я использовал для получения имени и даты изменения файлов, отображаемых в тексте.file.

Get-ChildItem -Path D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Audio\ -Recurse |
    Select-Object @{n='File'; e={$_.Name + "," + $_.LastWriteTime}} |
    Out-File "D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Audio\Log.txt"
Get-ChildItem -Path D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Video\ -Recurse |
    Select-Object @{n='File'; e={$_.Name + "," + $_.LastWriteTime}} |
    Out-File "D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Video\Log.txt"

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

FileName до попадания в программу: Some_Name_file.mxf

NewFileName после приема внутрь: random_exactly_37_characters_ FileName.mxf _random_exactly_11_characters

Исходный файл больше не существует, поэтому я мог бы просто добавить путь к нему и сказать, чтобы написать его имя.Так есть ли способ, которым я могу удалить эти 37 символов перед именем файла и последние 11 символов в конце имени файла и записать это в тот же текстовый файл.Я не хочу переименовывать NewFileName, потому что это изменило бы параметры изменения даты.

1 Ответ

0 голосов
/ 27 сентября 2019

Это предполагает, что подчеркивание и расширение файла включены в то, что вы хотите удалить, и вы всегда хотите удалить 37 начальных символов и 11 следующих символов.Вы можете сделать это, используя свойство Substring вашего имени файла.

$audioFiles = Get-ChildItem -Path D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Audio\ -File -Recurse |
    Select-Object @{n='File';e={$_.Name.Substring(37,($_.Name.Length-37-11))}},LastWriteTime
$audioFiles | Export-Csv "D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Audio\Log.csv" -NoTypeInformation

$videoFiles = Get-ChildItem -Path D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Video\ -File -Recurse |
    Select-Object @{n='File';e={$_.Name.Substring(37,($_.Name.Length-37-11))}},LastWriteTime 
$videoFiles | Export-Csv "D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Video\Log.csv" -NoTypeInformation

Имейте в виду, что индексы символов подстроки начинаются с 0 и заканчиваются на Length-1.


Альтернативой является использование оператора -replace, который использует регулярное выражение для сопоставления строк.

$audioFiles = Get-ChildItem -Path D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Audio\ -File -Recurse |
    Select-Object @{n='File';e={$_.Name -replace '^.{37}(.*).{11}$','$1'}},LastWriteTime
$audioFiles | Export-Csv "D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Audio\Log.csv" -NoTypeInformation

$videoFiles = Get-ChildItem -Path D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Video\ -File -Recurse |
    Select-Object @{n='File';e={$_.Name -replace '^.{37}(.*).{11}$','$1'}},LastWriteTime
$videoFiles | Export-Csv "D:\Documents\Projects\Trans-Wrapping\TestOut\NewFiles\Video\Log.csv" -NoTypeInformation
  • . соответствует любому не-символу новой строки.
  • {N}соответствует предыдущему механизму (. в данном случае) N раз.
  • (.*) - это группа захвата ($1), которая соответствует любому символу, пока не останется ровно 11 символов.
  • ^ обозначает начало строки.
  • $ обозначает конец строки.

По сути, все имя файла заменяется только средней подстрокой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...