Я новичок в powershell. Я хочу прочитать имена каждого файла в папке, например. 900_CA_2022.pdf
, удалите _
из имени файла и создайте новый текстовый файл с именем 900CA2022900_CA_2022.txt
По сути, я хочу удалить _
из имени файла без расширения, добавить последнее как есть и использовать новое расширение, .txt
Важный: все приведенные ниже решения создают новые файлы в каталоге Текущий. При необходимости создайте путь к целевому файлу с явным путем к каталогу, используя Join-Path
, например:Join-Path C:\target (($_.BaseName -replace '_') + $_.BaseName + '.txt')
Для создать новые, пустые файлы, чей имена должен быть получен из входных файлов, используйте New-Item
:
Get-ChildItem -Filter *.pdf |
New-Item -Path { ($_.BaseName -replace '_') + $_.BaseName + '.txt' } -WhatIf
Note: The -WhatIf
common parameter in the command above previews the operation. Remove -WhatIf
once you're sure the operation will do what you want.
Примечание. Если целевой файл существует, возникает ошибка. Если вы добавите -Force
, вместо существующего файла будет усеченный — используйте с осторожностью.
$_.BaseName
— имя входного файла без расширения.-replace '_'
удаляет все _
символы. от него.Для создать новые файлы, чей имена должен быть получен из входных файлов и заполнить их, используйте ForEach-Object
:
Get-ChildItem -Filter *.pdf |
ForEach-Object {
# Construct the new file path.
$newFilePath = ($_.BaseName -replace '_') + $_.BaseName + '.txt'
# Create and fill the new file.
# `>` acts like Out-File. To control the encoding, use
# something like `| Out-File -Encoding utf8 $newFilePath` instead.
"content for $newFilePath" > $newFilePath
}
Обратите внимание, что >
/Out-File
и Set-Content
(для строковых данных) незаметно заменяют содержимое существующего целевого файла.
Самый простой способ - использовать те же имя исходного файла + .текст для создания текстовых файлов, не нанося большого ущерба именам исходных файлов.
Например. 900_CA_2022.pdf -----> 900_CA_2022.pdf.txt
Код сценария
$files = Get-ChildItem "./*.pdf" -Recurse -Force
$files | ForEach-Object{
New-Item -Path "$($_ | Split-Path)/$($_ | Split-Path -Leaf).txt" -Force
}