Проблема сценария PowerShell — файлы не расшифровываются с помощью PGP автоматически

#powershell #pgp

#powershell #pgp

Вопрос:

Хорошо, я создал сценарий PS, который, похоже, прерывается где-то в середине, и мне нужна помощь в понимании того, почему он пропускает функцию. Я новичок в написании сценариев и понятия не имею, как отлаживать, поэтому любая помощь была бы полезной.

Функции скрипта:

  1. Извлеките зашифрованные файлы PGP с внешнего сервера в определенную папку
  2. Расшифруйте зашифрованные файлы и выходные данные PGP с расширением .csv
  3. Переместите исходные файлы в определенную папку архива
  4. Скопируйте расшифрованные файлы в онлайн-библиотеку SharePoint
  5. Переместить расшифрованные файлы в определенную папку архива

При запуске сценария он либо пропускает процесс расшифровки, либо расшифровывает не все файлы. Если я сам запущу код, он правильно расшифрует файлы. Если я запускаю часть кода, которая выполняет шаг 2-5 вручную, он не работает.

Моя цель — убедиться, что он обработает шаги 1-5 без вмешательства и каким-то образом добавит проверку в сценарий, что мне еще предстоит научиться делать.

Цели проверки:

  1. Подтвердите, что файлы были извлечены
  2. Для каждого извлеченного файла убедитесь, что создан расшифрованный файл
  3. После копирования в SPO убедитесь, что все файлы, которые были расшифрованы, находятся в SPO

Кто-нибудь может мне помочь или указать направление, как исправить мой сценарий, отладить и / или как выполнить проверку в сценариях? Я был бы очень благодарен!!

     $files = Get-ChildItem -Path "\WebDriveclientSFTPFrom_client*.*" -File
foreach ($file in $files)
{
    #Write-Output "Retrieving File: $file"
    Write-Output "$file  TO \servernamerecordsclientReceived" 
    
    try
    {
            Move-Item -Path "$file" "\servernamerecordsclientReceived" -Force 
}
catch
{
    Write-Output "Error pulling down the files. ($file)"
}

}

#Pause script for 10 seconds
Start-Sleep 10
#If I run the below all together it still fails.
#-----------------------    
$DestPath = "\servernamerecordsclientReceived"
$files = Get-ChildItem $DestPath -File
ForEach($file in $files)
{
   # try
    #{
        $outfile = $file.BaseName
        Write-Output "PGP Procesing: Input=$DestPath$file, Output=$DestPath$outfile"
        Start-Process -FilePath "C:Program Files (x86)GnuPGbingpg.exe" -WorkingDirectory "$DestPath" -ArgumentList "--pinentry-mode=loopback --passphrase passwordhere -o $DestPath$outfile $DestPath$file"

    #}
    #catch
    #{
     #   Write-Output "Error during PGP decryption of: $file"
    #}
}
#---------------
#If I run the lines of code between the #------ it will decrypt all the files correctly.

$files = Get-ChildItem "$DestPath*.csv" -File
ForEach($file in $files)
{
    try {
        Copy-Item -Path "$file" -Destination "\WebDriveSpoProfileShared Documentsclient2.From_client" -Force
        Move-Item -Path "$file" -Destination "\servernamerecordsclientReceivedArchiveDecrypted" -Force

    }
    catch
    {
        Write-Output "Error Moving file: $file"
    }

}

$files = Get-ChildItem "$DestPath*.pgp" -File
ForEach($file in $files)
{
    try 
    {
        Move-Item -Path "$file" -Destination "\servernamerecordsclientReceivedArchiveOriginal" -Force
    }
    catch
    {
        Write-Output "Error Moving file: $file"
    }

}

    
  

Комментарии:

1. Вы получаете какие-либо сообщения об ошибках? Также можете ли вы уточнить, когда это действительно работает? Вы сказали, что это работает, когда вы запускаете код сам по себе. Что такое «код» в этом контексте, потому что позже вы заявляете, что выполняете шаги 2-5, которые включают расшифровку, но что она не работает.

2. К сожалению, он не выдает никаких ошибок. Когда я запускаю приведенный ниже набор кода, он по-прежнему не работает. Он работает только тогда, когда я сам запускаю процесс дешифрования PGP, он расшифровывает все файлы. Я отредактирую свой исходный пост, потому что я не могу опубликовать его здесь из-за ограничения символов.

3. Что касается этого.. [Я новичок в написании сценариев и понятия не имею, как отлаживать], тогда жизненно важно, чтобы вы увеличили производительность PowerShell, ну, и сценариев в целом. На Youtube было много видеороликов Powershell для всех уровней . Отладка здесь . Также существует множество бесплатных веб-ресурсов. Например: tutorialspoint.com/powershell/index.htm . Если вы не разбираетесь в программировании / скриптах, тогда, конечно, проблема с debug isa.

Ответ №1:

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

Я считаю, что это связано со строкой $outfile = $file.BaseName и тем фактом, что последняя часть скрипта выполняет поиск файлов на основе расширений файлов. BaseName возвращает имя файла за вычетом расширения, поэтому, если ваш файл был назван banana.csv $file.BaseName , вернет banana

Ответ №2:

На самом деле у вас нет функций в этом опубликованном коде.

Никогда не запускайте деструктивный код (создание, создание, обновление, изменение, перемещение, удаление …) без предварительной проверки. Вот почему существует параметр -WhatIf .

В любом случае, попробуйте этот переработанный код.

 $DestPath = "\$ServerNamerecordsclientReceived"
$WebDrive = 'PathToSource'

Get-ChildItem -Path "\$WebDriveclientSFTPFrom_client*.*" -File |
ForEach-Object {
    Write-Output "$PSItem  TO \$ServerNamerecordsclientReceived" 
    
    Try
    {
        $moveItemSplat  = @{
            Destination = "\$ServerNamerecordsclientReceived"
            Path        = $PSItem
            Force       = $true
            ErrorAction = 'Stop'
        }
        Move-Item @moveItemSplat -WhatIf
    }
    Catch {Write-Warning -Message "Error pulling down the files. $PSItem"}
}

Start-Sleep 10


Get-ChildItem $DestPath -File | 
ForEach-Object {
    Try
    {
        $CurrentErrorActionPreference = $ErrorActionPreference
        $ErrorActionPreference        = 'Stop'

        "PGP Procesing: Input=$DestPath$PSItem, Output=$DestPath$($PSItem.FullName)"
        $startProcessSplat   = @{
            FilePath         = 'C:Program Files (x86)GnuPGbingpg.exe'
            ArgumentList     = "--pinentry-mode=loopback --passphrase passwordhere -o $DestPath$($PSItem.FullName) $DestPath$PSItem"
            WorkingDirectory = $DestPath
        }
        Start-Process @startProcessSplat
    }
    Catch {Write-Warning -Message "Error during PGP decryption of: $PSitem"}
    Finally {$ErrorActionPreference = $CurrentErrorActionPreference}
}

Get-ChildItem "$DestPath*.csv" -File | 
ForEach-Object {
    Try
    {
        $CurrentErrorActionPreference = $ErrorActionPreference
        $ErrorActionPreference        = 'Stop'

        $copyItemSplat  = @{
            Destination = "\$WebDriveSpoProfileShared Documentsclient2.From_client"
            Path        = $PSItem.FullName
            Force       = $true
        }
        Copy-Item @copyItemSplat

        $moveItemSplat  = @{
            Destination = "\$ServerNamerecordsclientReceivedArchiveDecrypted"
            Path        = $PSItem.FullName
            Force       = $true
        }
        Move-Item @moveItemSplat -WhatIf

    }
    Catch {Write-Warning -Messate "Error Moving file: $file"}
    Finally {$ErrorActionPreference = $CurrentErrorActionPreference}
}

Get-ChildItem "$DestPath*.pgp" -File | 
ForEach-Object {
    Try
    {
        $moveItemSplat  = @{
            Destination = "\$ServerNamerecordsclientReceivedArchiveOriginal"
            Path        = $PSItem.FullName
            Force       = $true
            ErrorAction = 'Stop'
        }
        Move-Item @moveItemSplat -WhatIf
    }
    Catch {Write-Warning -Messate "Error Moving file: $file"}
}