#powershell #pgp
#powershell #pgp
Вопрос:
Хорошо, я создал сценарий PS, который, похоже, прерывается где-то в середине, и мне нужна помощь в понимании того, почему он пропускает функцию. Я новичок в написании сценариев и понятия не имею, как отлаживать, поэтому любая помощь была бы полезной.
Функции скрипта:
- Извлеките зашифрованные файлы PGP с внешнего сервера в определенную папку
- Расшифруйте зашифрованные файлы и выходные данные PGP с расширением .csv
- Переместите исходные файлы в определенную папку архива
- Скопируйте расшифрованные файлы в онлайн-библиотеку SharePoint
- Переместить расшифрованные файлы в определенную папку архива
При запуске сценария он либо пропускает процесс расшифровки, либо расшифровывает не все файлы. Если я сам запущу код, он правильно расшифрует файлы. Если я запускаю часть кода, которая выполняет шаг 2-5 вручную, он не работает.
Моя цель — убедиться, что он обработает шаги 1-5 без вмешательства и каким-то образом добавит проверку в сценарий, что мне еще предстоит научиться делать.
Цели проверки:
- Подтвердите, что файлы были извлечены
- Для каждого извлеченного файла убедитесь, что создан расшифрованный файл
- После копирования в 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"}
}