Привет всем, мне нужна помощь с моим скриптом Powershell (я новичок в Powershell). В настоящее время я пытаюсь выполнить настройку сценария для преобразования документов RTF в PDF и сохранения их в каталоге. Теперь я хочу, чтобы мой скрипт выполнял рекурсивный поиск в моем исходном каталоге, если RTF-файл найден, и я хочу создать соответствующий каталог, в котором он был найден, в моем каталоге назначения и сохранить файл в местах назначения новый каталог.

Таким образом, следующим образом: если RTF найден в следующем каталоге C:\users\testuser\folder1\newuser , мой текущий скрипт преобразует документы и сохраняет его в C:\users\folder2 . Поэтому, если файл был найден в каталоге newuser, я хочу создать каталог newuser в C:\users\folder2\newuser и сохранить преобразованный документ в каталоге. Помогите, я новичок в powershell.

$source = "C:\users\testuser\folder1\"
$destination = "C:\users\testuser\folder2\"


$word_app = New-Object -ComObject word.application



#Convert RTF to PDF

Get-ChildItem -Path $source -Filter *.rtf? -Recurse | ForEach-Object {

    $document = $word_app.Documents.Open($_.FullName)

    $pdf_filename = "$destination\$($_.BaseName).pdf"

    $document.SaveAs([ref] $pdf_filename, [ref] 17)

    $document.Close()

}

$word_app.Quit()

1 ответ1

0

Тогда вам нужно будет использовать комбинацию Split-Path и String.Замените, чтобы создать новый путь из пути вашего исходного файла и создать новую папку и файл. Предостережение об использовании String.Заменить на то, что он чувствителен к регистру, поэтому ваши пути должны быть преобразованы в общий регистр, например, в нижний регистр. Пример использования Split-Path и String.Заменить ниже:

$Source = "C:\Users\testuser\Folder1"
$Destination = "C:\Users\testuser\Folder2"

$ExampleFile = $Source + "\newuser\thisfile.rtf"

#Use a combination of Split-Path and String.Replace
#Split-Path will take the full path to your file, and return just the parent folder path.
#String.Replace will then remove the $Source path from the remaining path.
#Finally we concatenate the new path with the $Destination path to get our new folder path.

$NewFolder = Split-Path $ExampleFile
Write-Host $NewFolder
# Output: C:\Users\testuser\Folder1\newuser

$NewFolder = $NewFolder.ToLower().Replace($Source.ToLower(), "")
Write-Host $NewFolder
# Output: \newuser

$NewFolder = $Destination + $NewFolder
Write-Host $NewFolder
# Output: C:\Users\testuser\Folder2\newuser

#Or, more simply:
$NewFolder = $($Destination + $(Split-Path $ExampleFile).ToLower().Replace($Source.ToLower(), ""))
Write-Host $NewFolder
# Output: C:\Users\testuser\Folder2\newuser

#Create the folder with ErrorAction = SilentlyContinue so that it doesn't throw an error if the folder already exists:
New-Item -Path $NewFolder -Type directory -ErrorAction SilentlyContinue

#Or, combine everything together and you have:
New-Item -Path $($Destination + $(Split-Path $ExampleFile).ToLower().Replace($Source.ToLower(), "")) -Type directory -ErrorAction SilentlyContinue

Ваш новый код будет выглядеть так:

$source = "C:\users\testuser\folder1\"
$destination = "C:\users\testuser\folder2\"

$word_app = New-Object -ComObject word.application

#Convert RTF to PDF

Get-ChildItem -Path $source -Filter *.rtf? -Recurse | ForEach-Object {

    $document = $word_app.Documents.Open($_.FullName)

    #Create new path and filename from source path and filename
    $pdf_filename = $($Destination + $(Split-Path $ExampleFile).ToLower().Replace($Source.ToLower(), "")) + "\" + $_.BaseName + ".pdf"

    #Create new folder tree
    New-Item -path $(Split-Path $pdf_filename) -Type directory -ErrorAction SilentlyContinue

    $document.SaveAs([ref] $pdf_filename, [ref] 17)

    $document.Close()

}

$word_app.Quit()

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .