0

PDFを画像に変換するプログラムがあります。プログラムを手動で実行している間、すべてが機能します。しかし、プログラムをスケジュールされたタスクとして実行しようとすると、ImageMagick または cmd (不明) が開始を拒否し、ステップをジャンプしてプログラムを停止させます。

別のユーザーで実行しようとしましたが(スケジュールされたタスクと特権を持つユーザーとしてプロセスを開始することの両方)、何も機能していないようで、次にどこから始めるべきかを理解していない、または知らないままです。

私の推測では、これはユーザー セキュリティに関係しており、C# のプロセス/コマンドから imagemagick を実行することは許可されていません。

コード:

string args = string.Format("/k convert -density 200 \"{0}\" -quality 40 \"{1}\\{2}\"", file.FullName, imageFolder, file.Name.Replace("pdf", "png"));
using (Process proc = new Process {
    StartInfo = {
        Arguments = args,
        FileName = @"CMD.exe",
        UseShellExecute = false,
        CreateNoWindow = true,
        RedirectStandardOutput = true,
        RedirectStandardError = true
    }
}) {
    proc.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
    proc.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
    proc.Start();
    proc.WaitForExit(5000);
    proc.Kill();
}
static void p_OutputDataReceived(object sender, DataReceivedEventArgs e) {
    using (StreamWriter sw = new StreamWriter(Program.BaseFolder + "\\log.txt")) {
        sw.WriteLine(e.Data);
    }
}
static void p_ErrorDataReceived(object sender, DataReceivedEventArgs e) {
    using (StreamWriter sw = new StreamWriter(Program.BaseFolder + "\\log.txt")) {
        sw.WriteLine(e.Data);
    }
}
4

2 に答える 2

0

ファイル名として cmd.exe を実行しています。どこでも実行したい実際の実行可能ファイルを指定していないようです。交換を試みることをお勧めします:

FileName = @"CMD.exe"

FileName = @"<the executable you want to run>"
于 2013-02-18T13:09:19.000 に答える
0

スケジュール タスクとユーザーが同じ環境パスを共有していないようです

そのため、ImageMagick、GhostScript を再インストールし、プログラムで絶対パスを使用しました。これで私の問題は解決しました。しかし、これら3つのことすべてを行ったときの正確な方法はわかりません。絶対パスを使用すると、単独で解決した可能性があります。

また、タイマーを削除しproc.WaitForExit()proc.Kill()プロセスが開始されなくなったためCMD.exe

string args = string.Format("-density 200 \"{0}\" -quality 40 \"{1}\\{2}\"", file.FullName, imageFolder, file.Name.Replace("pdf", "png"));
using (Process proc = new Process {
    StartInfo = {
        Arguments = args,
        FileName = @"c:\imagemagick\convert",
        UseShellExecute = false,
        CreateNoWindow = true,
        RedirectStandardOutput = true,
        RedirectStandardError = true
    }
}) {
    proc.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
    proc.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
    proc.Start();
    proc.WaitForExit();
}
于 2013-02-19T08:17:36.947 に答える