Board logo

标题: [问题求助] C#语句转成Powershell代码 [打印本页]

作者: 小白龙    时间: 2022-8-7 10:07     标题: C#语句转成Powershell代码

在下面的网站找到一段将doc转成pdf并加密的代码, C#代码如下
https://www.e-iceblue.cn/conversion/convert-word-to-protected-pdf-using-c.html

自己尝试将C#转成PS代码, 加载和保存都OK了, 只有一行加密参数的代码不知道怎么转, 即红色字部分,
请大佬指导, 多谢!

$doc = New-Object Spire.Doc.Document

$doc.LoadFromFile("$HOME\Desktop\test.docx")

$topdf = New-Object Spire.Doc.ToPdfParameterList
$topdf.PdfSecurity.Encrypt('open','permissions', PdfPermissionsFlags.Print | PdfPermissionsFlags.CopyContent, PdfEncryptionKeySize.Key128Bit)

$doc.SaveToFile("$HOME\Desktop\result.pdf", $topdf)
  1. using Spire.Doc;
  2. using Spire.Pdf.Security;
  3. namespace WordToPDFAndEncrypt_PDF
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             //加载Word测试文档
  10.             Document doc = new Document();
  11.             doc.LoadFromFile("test.docx");
  12.             //转为PDF时,设置PDF打开密码和权限密码
  13.             ToPdfParameterList topdf = new ToPdfParameterList();
  14.             topdf.PdfSecurity.Encrypt("open", "permission", PdfPermissionsFlags.Print | PdfPermissionsFlags.CopyContent, PdfEncryptionKeySize.Key128Bit);
  15.             
  16.             //将文档保存为PDF格式
  17.             doc.SaveToFile("result.pdf", topdf);
  18.             System.Diagnostics.Process.Start("result.pdf");
  19.         }
  20.     }
  21. }
复制代码

作者: went    时间: 2022-8-7 10:58

按位或操作, 竖线换成-bor试试
PdfPermissionsFlags.Print -bor PdfPermissionsFlags.CopyContent
作者: 小白龙    时间: 2022-8-7 11:12

回复 2# went

谢谢大佬,
改成这样, 还是报错, 用()括起来也不行

$topdf.PdfSecurity.Encrypt('open','permissions', PdfPermissionsFlags.Print -bor PdfPermissionsFlags.CopyContent, PdfEncryptionKeySize.Key128Bit)
作者: flashercs    时间: 2022-8-7 14:06

  1. $doc = New-Object Spire.Doc.Document
  2. $doc.LoadFromFile("$HOME\Desktop\test.docx")
  3. $topdf = New-Object Spire.Doc.ToPdfParameterList
  4. $topdf.PdfSecurity.Encrypt('open','permissions', 'Print,CopyContent', 'Key128Bit')
  5. $doc.SaveToFile("$HOME\Desktop\result.pdf", $topdf)
复制代码

作者: 小白龙    时间: 2022-8-7 20:55

回复 4# flashercs


  大佬, 又遇到一个C#奇怪的转换问题, 下面的红字部分,


//创建Word文档1,加载源文档
Document doc1 = new Document();
doc1.LoadFromFile("test.docx");

//创建一个空白文档,作为复制内容的目标文档
Document doc2 = new Document();

//获取Word文档1第一节的第2段和第3段
Section s = doc1.Sections[0];
Paragraph p1 = s.Paragraphs[1];
Paragraph p2 = s.Paragraphs[2];

//在Word文档2中添加Section,并将文档1中的第2、3段的内容复制到文档2中
Section s1 = doc2.AddSection();
Paragraph NewPara1 = (Paragraph)p1.Clone();
s1.Paragraphs.Add(NewPara1);
Paragraph NewPara2 = (Paragraph)p2.Clone();
s1.Paragraphs.Add(NewPara2);

//保存文档
doc2.SaveToFile("output.docx", FileFormat.Docx2010);
作者: flashercs    时间: 2022-8-8 11:25

回复 5# 小白龙
  1. $NewPara1 = $p1.Clone()
复制代码

作者: 小白龙    时间: 2022-8-8 16:40

本帖最后由 小白龙 于 2022-8-8 17:05 编辑

回复 6# flashercs

大佬真是神了, 无所不通! 感谢!

我对C#刚懂点皮毛, 能再请教个小问题吗?
最下面的C#代码是能输出的, 但是函数的返回值是void, 从Console输出的, 我想将返回值设为string, 改为了如下, 却没有任何输出

public static string Execute(string command)
{
        var ps = PowerShell.Create());

        var results = ps.AddScript(command).Invoke();
       
        return results.ToString();
}
  1. public static void Execute(string command)
  2. {
  3. var ps = PowerShell.Create());
  4. var results = ps.AddScript(command).Invoke();
  5. foreach (var result in results)
  6. {
  7. Console.WriteLine(result.ToString());
  8. }
  9. }
复制代码

作者: flashercs    时间: 2022-8-8 17:04

回复 7# 小白龙


    调试,出错截图.
作者: 小白龙    时间: 2022-8-8 17:07

回复 8# flashercs


大佬, 是没有任何输出, 不报错
是这个链接的代码:
https://blog.51cto.com/u_15242344/4895426
作者: 小白龙    时间: 2022-8-8 20:13

回复 8# flashercs

var results = ps.AddScript(command).Invoke();
foreach (var result in results)
{
        Console.WriteLine(result.ToString());
}


上面红色字这样就有输出, 下面改成蓝色字这样, 我加了return, 函数输出类型那里从void改为了string, 就没有输出了
感觉应该是下面第二行 tostring()的问题, 对象可能不支持转字符串, 但是我不知道怎么改

var results = ps.AddScript(command).Invoke();
return results.ToString();
作者: xczxczxcz    时间: 2022-8-8 21:00

试试介样子:
  1. public static string[] Execute1(string command){
  2. var ps = PowerShell.Create();
  3. var results = ps.AddScript(command).Invoke();
  4. return results.ToList().Foreach(x => $"{x}").ToArray();
  5. }
复制代码

作者: xczxczxcz    时间: 2022-8-8 21:08

或这样:
  1. public static string Execute2(string command){
  2.         var ps = PowerShell.Create();
  3.        var results = ps.AddScript(command).Invoke();
  4.        return results.FirstOrDefault().ToString();
  5. }
复制代码

作者: 小白龙    时间: 2022-8-8 22:12

回复 12# xczxczxcz

感谢大佬帮助, 上面第二个好像可以了, 第一个好像不行, 我的是 .net 4.8
作者: 小白龙    时间: 2022-8-8 23:01

本帖最后由 小白龙 于 2022-8-8 23:04 编辑

回复 12# xczxczxcz

大佬好, 试了好长时间, 我用下面的PS代码生成DLL, 一执行就报错, 用红色代码测试时是对的, 但是生成不了DLL, 用蓝色代码,测试时是错的, 但是能生成DLL
希望大佬帮忙, 谢谢

Add-Type -Path @(
        ".\System.Management.Automation.dll"
)
Add-Type -TypeDefinition @"
using System.Management.Automation;

public class Code
{
        public static string RunPs(string command)
        {
                using (var ps = PowerShell.Create())
                {
                        var results = ps.AddScript(command).Invoke();
                        return results.FirstOrDefault().ToString(); //测试时,结果是对的,但不能生成dll,报错
                        //return results.ToString(); //测试时,结果是错的, 但是能生成dll
                }
        }
}
"@ -outputType library -outputAssembly "code.dll"
作者: 小白龙    时间: 2022-8-8 23:02

报错如下:
Add-Type : c:\Users\Administrator\AppData\Local\Temp\opdun1nt\opdun1nt.0.cs(10) : 'System.Collections.ObjectModel.Collection<System.Management.Automation.PSObj
ect>' does not contain a definition for 'FirstOrDefault' and no extension method 'FirstOrDefault' accepting a first argument of type 'System.Collections.Object
Model.Collection<System.Management.Automation.PSObject>' could be found (are you missing a using directive or an assembly reference?)
作者: flashercs    时间: 2022-8-9 03:24

  1. Add-Type -TypeDefinition @"
  2. using System;
  3. using System.Management.Automation;
  4. using System.Linq;
  5. public class Code
  6. {
  7.         public static string RunPs(string command)
  8.         {
  9.                 using (var ps = PowerShell.Create())
  10.                 {
  11.                         var results = ps.AddScript(command).Invoke();
  12.                         return string.Join(Environment.NewLine,results.Select(delegate(PSObject pso){return pso.ToString();}).ToArray()); //测试时,结果是对的,但不能生成dll,报错
  13.                         //return results.ToString(); //测试时,结果是错的, 但是能生成dll
  14.                 }
  15.         }
  16. }
  17. "@ -outputType library -outputAssembly "code.dll" -ReferencedAssemblies System.Core,System.Management.Automation
复制代码

作者: 小白龙    时间: 2022-8-9 11:41

回复 16# flashercs

感谢大佬, 可以生成dll了, 我删掉最后面的代码也能生成dll -ReferencedAssemblies System.Core,System.Management.Automation
但转字符串那里一点也看不懂了, 懂的太少了




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2