Unity学习笔记--如何在Unity运行cmd?并且在Unity中利用cmd操作svn(例如生成svn--diff文件)

news2025/7/17 22:18:22

目录

    • 前言
    • 需求拆分
    • 解决方案
    • 实操

前言

最近工作有一个需求,简单来说是在 Unity 里面动态获取 SVN diff 的数据,并且针对这些 diff 文件做对应操作

需求拆分

我们首先拆分下需求

  1. Unity里面获取 SVNdiff 文件
  2. 针对生成的 diff 文件做解析,找到对应的文件
  3. 对这些文件做对应操作

下面是伪代码

string target_folder_path = "";//SVN diff文件夹

//步骤一
string svn_diff_file_path = Tools.CreateSVNDiffFile(folder_path);

//步骤二
string[] diff_files_path = Tools.Deserialize(svn_diff_file_path);

//步骤三
foreach(string file in diff_files_path)
{
	DoSomethings(file);
}

这里面最关键的是 SVN diff 文件的生成

解决方案

由于我们知道 SVN 支持 cmd 操作,所以我们可以考虑使用 cmd 来生成对应文件。
但是这里有个难点,Unity怎么打开 cmd 窗口呢?
我们可以考虑开一个进程,这个进程启动 cmd 就好了,然后输入我们需要的 SVN 指令就好了

但是我们需要知道以下知识:

  1. 如何利用C#代码,在程序里面开启一个进程
  2. 了解 SVN 的一些指令,例如 svn diff
  3. 知道如何在 cmd 生成对应文件

下面来告诉大家上面三个知识

  1. C#中开启一个进程
Process p = new Process(); //新建系统进程

//Process中的StartInfo为要传递给Process.Start()方法的属性

//设置p.StartInfo属性
p.StartInfo.FileName = "cmd.exe"; //要启动的应用程序
p.StartInfo.Arguments = ""; //启动应用程序时要使用的一组命令行参数
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动进程(如果是从可执行文件创建进程,应设置为false)
p.StartInfo.RedirectStandardInput = true; //指示应用程序的输入是否从StandardInput流中读取的值(StandardInput)
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true; //不显示程序窗口

p.Start(); //启动进程
p.WaitForExit(); //等待程序执行完退出进程
p.Close(); //关闭进程
  1. svn diff
    直接在 cmd 中输入 svn diff 就好了
    在这里插入图片描述
  2. 知道如何在 cmd 生成对应文件
    需要在后面加一个

> log.txt

svn diff > log.txt

在这里插入图片描述
在这里插入图片描述
4. 其实我们可以写一个更高级的,不需要先利用 cd 命令进入对应文件夹,我们可以直接在初始路径进行操作
在这里插入图片描述

svn diff 你的路径 > 输出log.txt文件路径

实操

现在我们知道了上述知识,我们就可以开始写代码了

SVNTools.cs

using System.Diagnostics;
using UnityEditor;
using System.Collections.Generic;

namespace SVNTool
{
    /// <summary>
    /// Unity SVN工具
    /// </summary>
    public class SVNTool
    {
        /// <summary>
        /// cmd命令模板
        /// </summary>
        private static string cmdCommandModule = "svn {0} {1} > {2}";//svn 操作 输入文件夹路径 输出文件路径
                                                                     //例:svn diff C:/TestInput > C:/TestInput/diff.txt

        public static string DiffSelect(string folder_path)
        {
            string output_file_path = folder_path + "/diff.txt";
            string cmdCommand = string.Format(cmdCommandModule, "diff", folder_path, output_file_path);
            InvokeCmd(cmdCommand);
            return output_file_path;
        }

        /// <summary>
        /// 调用cmd
        /// </summary>
        /// <param name="cmdCommand">cmd命令</param>
        private static void InvokeCmd(string cmdCommand)
        {
            Process p = new Process(); //新建系统进程

            //Process中的StartInfo为要传递给Process.Start()方法的属性

            //设置p.StartInfo属性
            p.StartInfo.FileName = "cmd.exe"; //要启动的应用程序
            p.StartInfo.Arguments = "/c " + cmdCommand + "&exit"; //启动应用程序时要使用的一组命令行参数
            p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动进程(如果是从可执行文件创建进程,应设置为false)
            p.StartInfo.RedirectStandardInput = true; //指示应用程序的输入是否从StandardInput流中读取的值(StandardInput)
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true; //不显示程序窗口

            p.Start(); //启动进程
            p.WaitForExit(); //等待程序执行完退出进程
            p.Close(); //关闭进程
        }
    }

	// 负责解析 diff 文件数据
    public class SVNDiffDeSerializeHelper
    {
        private string SPLIT_SIGN = "Index: ";
        public List<SVNDiffData> datas;

        public SVNDiffDeSerializeHelper()
        {
            datas = new List<SVNDiffData>();
        }

        public void DeSerialize(string[] contents)
        {
            for (int i = 0; i < contents.Length; i++)
            {
                if (contents[i].StartsWith(SPLIT_SIGN))
                {
                    string file_path = contents[i].Substring(SPLIT_SIGN.Length);
                    datas.Add(new SVNDiffData(file_path));
                }
            }
        }

    }

	// diff 文件Data
    public class SVNDiffData
    {
        public string file_path;//由于当前需求只需要知道文件路径,所以这里只存了文件路径,大家如果有自己的需求,可以加成员变量
        public SVNDiffData(string file_path_in)
        {
            file_path = file_path_in;
        }
    }
}

具体执行函数

private void Do(string folderPath)
{
	//生成diff.txt文件
	string diff_file_path = SVNTool.DiffSelect(folderPath);
	SVNDiffDeSerializeHelper svn_helper = new SVNDiffDeSerializeHelper();
	//反序列化
	svn_helper.DeSerialize(File.ReadAllLines(diff_file_path));
	//获得被修改之后的.fbx文件路径
	List<SVNDiffData> datas = svn_helper.datas;
	foreach(SVNDiffData data in datas)
	{
		DoSomethings(data);
	}
}

private void DoSomethings(SVNDiffData svn_diff_data)
{
	//DoSomethings
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 视频播放

一、简介Qt对音视频的播放和控制&#xff0c;相机拍照&#xff0c;收音机等多媒体应用提供了强大的支持。Qt5使用了全新的Qt Multimedia模块来实现多媒体应用&#xff0c;而原来Qt4中用于实现多媒体功能的Phonon模块已经被移除。新的Qt Multimedia模块提供了丰富的接口&#xf…

【从零开始学习深度学习】50.Pytorch_NLP项目实战:卷积神经网络textCNN在文本情感分类的运用

在之前介绍的“卷积神经网络”中我们探究了如何使用二维卷积神经网络来处理二维图像数据。在语言模型和文本分类任务中&#xff0c;我们将文本数据看作是只有一个维度的时间序列&#xff0c;并很自然地使用循环神经网络来表征这样的数据。其实&#xff0c;我们也可以将文本当作…

安装 MySQL

1.下载安装文件 访问MySQL官网下载安装文件。 如下图所示&#xff0c;点击页面中的“DOWNLOAD”按钮。 点击下载之后自动进行下载。下载到本地的文件名称为&#xff1a;mysql-8.0.31-winx64.zip 2.解压安装文件 将压缩文件解压到你安装的目录&#xff0c;比如&#xff1a;F:…

数据结构与算法笔记

0 核心框架汇总 框架思维 数据结构的存储方式只有两种&#xff1a;数组&#xff08;顺序存储&#xff09;和链表&#xff08;链式存储&#xff09; 算法 数学中的算法重在推导&#xff0c;计算机中的算法重在穷举 计算机算法的本质特点&#xff1a; 穷举 穷举有两个关键难点…

Linux环境 java应用问题排查

0&#xff09;查看CPU占用高的进程PID top -d 1 或 top -H 注&#xff1a; top -d 1 中的 1 是数字&#xff1a;1&#xff0c;不是字母 &#xff1a;l 。 1&#xff09;查看内存使用情况&#xff08;memory-info.log为具体文件路径&#xff09; jmap -heap PID > memory-i…

某程序员跳槽涨薪50%!网友:不合理~

在IT届&#xff0c;有个传闻&#xff0c;跳槽就是程序猿涨工资最好的方式。大家认为程序员跳槽要求涨薪50%合理吗&#xff1f;有人说&#xff1a;凭本事涨的为啥不合理&#xff01;01程序员跳槽要求涨薪50%过分吗&#xff1f;在知乎上看到这样一个帖子&#xff0c;有人提问“程…

CANoe 15版本中CAPL代码自动补全功能的小Bug

最近在使用CANoe 15版本的软件编写CAPL脚本时,遇到了一些小的困扰,记录下来分享给大家! 当我在capl函数中要传入两个参数时,除了逗号隔开两个参数外,还希望有一个空格能进一步拉开两个参数的距离,增加代码的可读性 但是,传入第一个参数后,输入逗号,此时capl的自动补…

IP 网络主动监测系统 Renix Active

一、IT网络运维面临的挑战​ 1.网络性能可视化​ • 与公有云和SaaS平台连接的可靠性​ • 广域网线路性能​ • 互联网专线性能​ 2.诊断工具​ • 现场无IT工程师覆盖​ • 诊断的人力费用​ • 网络与应用系统的纠结​ 3.用户体验​ • Web应用的访问质量​ • 语…

C++设计模式(2)——工厂方法模式

亦称&#xff1a; 虚拟构造函数、Virtual Constructor、Factory Method 意图 工厂方法模式是一种创建型设计模式&#xff0c; 其在父类中提供一个创建对象的方法&#xff0c; 允许子类决定实例化对象的类型。 问题 假设你正在开发一款物流管理应用。 最初版本只能处理卡车…

单目标应用:蜣螂优化算法DBO与麻雀搜索算法SSA求解无人机三维航迹规划(提供Matlab代码)

一、无人机三维航迹规划 三维航迹规划是无人机在执行任务过程中的非常关键的环节&#xff0c;三维航迹规划的主要目的是在满足任务需求和自主飞行约束的基础上&#xff0c;计算出发点和目标点之间的最佳航路。 1.1路径最短约束 无人机航迹规划的首要目标是寻找起飞点和目标点…

一文搞定visual studio code远程服务器的配置和文件上传

在跑大型程序的时候需要用到服务器&#xff0c;因此如何远程操作服务器就至关重要了。 很多教程教如何使用putty来操作&#xff0c;但是我的安装时候就出现错误了。再加上我用的visual studio code提供远程服务器控制以及文件传输功能。 因此我就使用vscode来配置相应的环境并…

Unity学习笔记--FixedUpdate真的是固定时间调用一次吗?

前言 我相信大家在学习Unity的时候&#xff0c;Update是每一帧调用&#xff0c;而FixedUpdate是固定时间调用一次。 一开始我们对这个知识深信不疑&#xff08;楼主也是 .| &#xff09; 不过当我们学的更深入时&#xff0c;发现Unity其实是单线程的&#xff0c;所以它的生命…

解决d2l包下载不了的问题

目录 关于d2l包 1、在pypi网站的找到d2l包 2、cmd下载文件 3、检测d2l包的下载是否成功 4、在虚拟环境中完成安装 关于d2l包 d2l包是李沐老师等人开发的《动手深度学习》配套的包&#xff0c;最初的时候&#xff0c;我并没有安装的想法&#xff0c;可在代码实现方面&…

如何使用 max_fanout

在 逻辑层级不多&#xff0c;但是延时较高的 net 中&#xff0c;可以使用 max_fanout 来设置扇出&#xff0c; 但是要注意&#xff0c;还要如果驱动与负载不在同一层&#xff0c;一定要约束到负载的input&#xff0c;否则不生效 并且还要在 例化负载模块时加上 (* keep_hiera…

nacos安装及配置

本文介绍nacos的安装、配置&#xff0c;使用mysql存储数据。 1.下载 在github上下载对应的压缩包。地址&#xff1a;https://github.com/alibaba/nacos/releases 本文下载的是2.0.2版本&#xff1a; 2.解压 进入下载文件所在的目录&#xff0c;并执行以下语句&#xff1a; t…

GEE10:Earth Engine Reducers的图像矢栅转换及区域统计

目录1. Raster to Vector Conversion&#xff1a;image.reduceToVectors()2. Vector to Raster Conversion&#xff1a;featureCollection.reduceToImage()3. Grouped reductions3.1 Grouped reduceRegions (aka Zonal Statistics)4. Weighted Reductions1. Raster to Vector C…

SSM整合案例[企业权限管理系统]-学习笔记01【SVN的基本介绍】

Java后端-学习路线-笔记汇总表【黑马程序员】SSM整合案例[企业权限管理系统]-学习笔记01【SVN的基本介绍】【day01】SSM整合案例[企业权限管理系统]-学习笔记02【TortoiseSVN的基本操作】SSM整合案例[企业权限管理系统]-学习笔记03【TortoiseSVN及IDEA下SVN的使用】SSM整合案例…

四旋翼无人机学习第21节--allergo软件中的元器件高亮显示与丝印3D显示设置

1 allergo软件中的元器件高亮显示 在设计PCB的时候&#xff0c;会出现元器件高亮的情况&#xff0c;并且在项目重启后&#xff0c;这种现象依然存在。现在终于找到了原因的所以。点击高亮的元器件&#xff0c;右键选择选择Dehighlight即可。 取消高亮后的元器件显示。 2 解决…

已解决Building wheels for collected packages: lxml

已解决&#xff08;pip安装第三方模块lxml模块报错&#xff09;Building wheels for collected packages: lxml Building wheel for lxml (setup.py) … error error: subprocess-exited-with-error python setup.py bdist_wheel did not run successfully. note: This error o…

Polar vector and axial vector(极矢量和轴向矢量)

Polar vector and axial vector引言Polar vector中文翻译定义第一种第二种第三种性质举例Axial vector中文翻译定义性质举例讨论引言 今天来给大家介绍一下Polar vector和axial vector&#xff0c;即极矢量和轴向矢量。 Polar vector 中文翻译 极矢量 定义 第一种 在基础…