C# Запуск процесса с аргументами в указанной папке c - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь декомпилировать более 30k файлов шалдеров vulkan с помощью шейдера c от Google. Все шейдеры находятся в "C: \ Users \ Admin \ Desktop \ NMS MOD \ SHADER MOD \ v2.41 \ P C"

. Инструментом, используемым для декомпиляции, является spirv-cross.exe, который Я добавил в Windows переменные окружения, что позволяет мне запускать этот простой bat-файл в папке шейдеров и работает нормально. "spirv-cross --version 450 --vulkan-semantics --stage frag ATMOSPHERE_FRAG_CLOUD_769.SPV> ATMOSPHERE_FRAG_CLOUD_769.GLSL"

Поскольку их слишком много, чтобы сделать это вручную. Я хочу создать простое приложение для этого процесса, а также получить тип сцены из имени файла (в данном случае «frag»).

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace Lazy_Me_3
{
    public partial class Form1 : Form
    {
        public string PATH;
        public string[] sFilesNames;
        public int totalcount = 0;
        public int currentcount = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private string GetStageType(string filename)
        {
            // Valid Stages = vertex, vert, fragment, frag, tesscontrol, tesc, tesseval, tese, geometry, geom, compute, comp

            if (filename.Contains("_VERTEX_") || filename.Contains("_VERT_")) return "vert";
            if (filename.Contains("_FRAGMENT_") || filename.Contains("_FRAG_")) return "frag";
            if (filename.Contains("_TESSCONTROL_") || filename.Contains("_TESC_")) return "tesc";
            if (filename.Contains("_TESSEVEL_") || filename.Contains("_TESE_")) return "tese";
            if (filename.Contains("_GEOMETRY_") || filename.Contains("_GEOM_")) return "geom";
            if (filename.Contains("_COMPUTE_") || filename.Contains("_COMP_")) return "comp";

            else return "error";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < sFilesNames.Count(); i++)
            {
                sFilesNames[i] = Path.GetFileName(sFilesNames[i]);

                if (sFilesNames[i].Length > 1)
                {
                    var newName = sFilesNames[i].Substring(0, sFilesNames[i].Length - 4);
                    sFilesNames[i] = newName;
                }
            }

            foreach (var file in sFilesNames)
            {
                string stageType = GetStageType(file);
                if (stageType != "error")
                {
                    string args = "--version 450 --vulkan-semantics --stage " + stageType + " " + file + ".SPV" + " > " + file + ".GLSL";

                    Process process = new Process();
                    process.StartInfo.FileName = "spirv-cross";
                    process.StartInfo.Arguments = args;
                    process.StartInfo.WorkingDirectory = PATH;
                    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    process.Start();

                    process.WaitForExit(5000);

                    currentcount += 1;
                    label1.Text = "Status : " + currentcount.ToString() + " / " + totalcount.ToString();
                }
                else MessageBox.Show("Error on finding stage type of file : " + file);
            }
        }


        private void button2_Click(object sender, EventArgs e)
        {
            using (var fbd = new FolderBrowserDialog())
            {
                DialogResult result = fbd.ShowDialog();

                if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
                {
                    sFilesNames = Directory.GetFiles(fbd.SelectedPath, "*.SPV");
                    totalcount = sFilesNames.Length;

                    PATH = fbd.SelectedPath;
                    label3.Text = "Directory : " + PATH;
                    label2.Text = "Total Count : " + totalcount.ToString();
                    label1.Text = "Status : 0 / " + totalcount.ToString();
                    button1.Enabled = true;
                }
            }
        }
    }
}

РЕДАКТИРОВАТЬ 1: Bodge с помощью cmd, который работает

private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < sFilesNames.Count(); i++)
            {
                //sFilesNames[i] = Path.GetFileName(sFilesNames[i]);

                if (sFilesNames[i].Length > 1)
                {
                    var newName = sFilesNames[i].Substring(0, sFilesNames[i].Length - 4);
                    sFilesNames[i] = newName;
                }
            }

            foreach (var file in sFilesNames)
            {
                string stageType = GetStageType(file);
                if (stageType != "error")
                {
                    var p = new ProcessStartInfo("cmd", @"/c spirv-cross --version 450 --vulkan-semantics --stage " + stageType + " " + file + ".SPV" + " > " + file + ".GLSL");

                    p.UseShellExecute = false;
                    p.CreateNoWindow = true;

                    var ps = Process.Start(p);

                    ps.WaitForExit();

                    currentcount += 1;
                    label1.Text = "Status : " + currentcount.ToString() + " / " + totalcount.ToString();
                }
                else
                {
                    errorcount += 1;
                    label4.Text = "Errors : " + errorcount.ToString();
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...