Цикл Powershell для записи файлов, защищенных паролем - PullRequest
1 голос
/ 02 мая 2019

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

#working individually
$f = ("C:my\path\Out Files\1234dv.xlsx")
$outfile = $f.FullName + "out" 
$xlNormal = -4143 

$xl = new-object -comobject excel.application 
$xl.Visible = $True 
$xl.DisplayAlerts = $False     
$wb = $xl.Workbooks.Open($f)
$a = $wb.SaveAs("C:my\path\Out Files\test.xls",$xlNormal,"test")
$a = $xl.Quit() 

$a = Release-Ref($ws) 
$a = Release-Ref($wb) 
$a = Release-Ref($xl) 



#not working in loop, error after
function Release-Ref ($ref) { 
    ([System.Runtime.InteropServices.Marshal]::ReleaseComObject( 
    [System.__ComObject]$ref) -gt 0) 
    [System.GC]::Collect() 
    [System.GC]::WaitForPendingFinalizers()  
    } 

foreach ($f in Get-ChildItem "C:\my\path\Out Files"){
    $ff = $f
    $outfile = $f.FullName + "out" 
    $xlNormal = -4143 

    $xl = new-object -comobject excel.application 
    $xl.Visible = $True 
    $xl.DisplayAlerts = $False     
    $wb = $xl.Workbooks.Open($ff)
    $a = $wb.SaveAs("C:\my\path\Out Files\test.xls",$xlNormal,"test")
    $a = $xl.Quit() 

    $a = Release-Ref($ws) 
    $a = Release-Ref($wb) 
    $a = Release-Ref($xl) 
}

Извините, мы не смогли найти 1234dv.xlsx.Возможно ли это было перемещено, переименовано или удалено?В строке: 16 символов: 5 + $ wb = $ xl.Workbooks.Open ($ ff) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: OperationStopped: (:) [], COMException + FullyQualifiedErrorId: System.Runtime.InteropServices.COMException COM-объект, который был отделен от базового RCW, использовать нельзя.В строке: 17 символов: 5 + $ a = $ wb.SaveAs ("C: \ my \ path ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo: OperationStopped: (:)[], InvalidComObjectException + FullyQualifiedErrorId: System.Runtime.InteropServices.InvalidComObjectException

Эта ошибка повторяется для всех четырех тестовых файлов, с которыми я работаю.

Я не очень знаком сPowershell, поэтому я полагался на документы MS, и я не мог защитить паролем файлы в python, поэтому думал, что это будет проще. Я знаю, что это также не относится к паролю, но я пытался сначала запустить цикл. Любая помощьс благодарностью. Спасибо.

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

немного не по теме для вашего вопроса, но не для вашего намерения:

с точки зрения безопасности с использованием паролей .xls - это не безопасность, это просто раздражение.

если вам нужна безопасностьЗатем я предлагаю вам использовать что-то вроде Azure Information Protection, которое позволяет вам шифровать и безопасно делиться файлом только с теми, кому нужен доступ.

Вам все еще нужно создать файлы xls или .xlsx (или любые другиефайл в этом отношении), то вы можете PowerShell просто зациклить их:

PS C:\>foreach ($file in (Get-ChildItem -Path \\server1\Docs -Recurse -Force | 
    where {!$_.PSIsContainer} |
    Where-Object {$_.Extension -eq ".xls"})) {
       Protect-RMSFile -File $file.PSPath -InPlace -DoNotPersistEncryptionKey All -TemplateID "e6ee2481-26b9-45e5-b34a-f744eacd53b0" -OwnerEmail "IT@Contoso.com"
}

https://docs.microsoft.com/en-us/powershell/module/azureinformationprotection/protect-rmsfile?view=azureipps

2 голосов
/ 02 мая 2019

Вы должны использовать

$wb = $xl.Workbooks.Open($ff.FullName)

Чтобы дать Excel полный путь к файлу. В противном случае $ff является объектом FileInfo, где требуется строка (путь)

Что касается защиты паролем, я предлагаю , это может помочь вам.

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