首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何通过shell打开调用Delphi程序打开多个文件

要通过shell打开调用Delphi程序打开多个文件,您可以使用以下步骤:

  1. 创建一个Delphi程序,该程序可以接受多个文件名作为参数。
  2. 在Delphi程序中,使用命令行参数解析库(如 TStrings 类型的 ParamStr 函数)来解析传递给程序的所有文件名。
  3. 使用Delphi的文件操作库(如 System.IOUtils)打开并处理每个文件。
  4. 在shell中,使用批处理文件(.bat.cmd)或 PowerShell 脚本来调用您的Delphi程序,并传递要处理的文件名列表。

以下是一个简单的示例,展示了如何在Delphi中处理命令行参数并打开多个文件:

代码语言:delphi
复制
program ProcessFiles;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, System.IOUtils;

var
  I: Integer;
begin
  try
    if ParamCount = 0 then
    begin
      Writeln('Usage: ProcessFiles<filename1><filename2> ...');
      ExitCode := 1;
    end;

    for I := 1 to ParamCount do
    begin
      try
        TFile.ReadAllText(ParamStr(I));
        Writeln('Processed file: ', ParamStr(I));
      except
        on E: Exception do
          Writeln('Error processing file ', ParamStr(I), ': ', E.Message);
      end;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

在shell中,您可以创建一个批处理文件(.bat)来调用此Delphi程序,如下所示:

代码语言:batch
复制
@echo off
ProcessFiles.exe file1.txt file2.txt file3.txt

或者,您可以使用PowerShell脚本:

代码语言:powershell
复制
./ProcessFiles.exe "file1.txt" "file2.txt" "file3.txt"

这将允许您使用shell来调用Delphi程序,并传递要处理的文件名列表。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • ShellExecute使用详解

    有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂,比较少用。 2.WinExec主要运行EXE文件。如:WinExec(‘Notepad.exe Readme.txt’, SW_SHOW); 3.ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。 首先必须引用shellapi.pas单元:uses ShellAPI; 1).标准用法   ShellExecute函数原型及参数含义如下:   function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;   ●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口 句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。   ●Operation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件 夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执 行默认操作“open”。    ●FileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。   ●Parameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。   ●Directory:用于指定默认目录。   ●ShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。   若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。   上述仅仅是ShellExecute函数的标准用法,下面将介绍它的特殊用法。 2).特殊用法   如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器 ,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。   格式一:http://网站域名。   如:ShellExecute(handle, ‘open’, http://www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);   格式二:http://网站域名/网页文件名。   如:ShellExecute(handle, ‘open’, http://www.neu.edu.cn/default.htm’,nil,nil,SW_SHOWNORMAL);

    01

    Delphi类型和引用

    概要介绍: 类类型和下面要讲到的类引用类型是一种特殊的数据类型,是Object Pascal面向对象编程的基础。  一:类类型概述 和以前介绍的几种数据类型相比,类类型具有如下特点: 类类型的成员可以是不同的数据类型,这一点跟记录类型相似,因此,类类型首先是由不同的字段 组成的。 类类型除了包含数据以外,还包含了操纵数据的方法及特性。类类型把数据和方法封装在一起。 类类型具有可继承性,所谓继承就是一个新的类类型,不必什么都从新定义,只需要继承一个已有 的类型再加上自己的成员就构成一个新的类类型。事实上Delphi中所有的元件都是从一些共同的祖先类 继承下来的,利用类的可继承性,您可以编写您自己的类元件,并把它加到Delphi的环境中去。 被继承的类我们称为基类,继承下来的类我们称为派生类,基类的成员自动成为派生类的成员。类 的继承具有传递性,例如假设T3继承了T2,而T2又是继承了T1,可以认为T3也继承T1。在Delphi中,所 有的类都是从一个共同的类TObject继承下来的,TObject类的声明在System单元中,它定义了一些操纵 类的最基本的方法,因此,Tobject也被称为缺省祖先类。 TObject是一个抽象类,它的派生类可以对TObject中的方法重载,包括对它的构造 Create 和析构 Destory的重载。 二:类类型的声明 类类型的声明比较复杂,其语法如下: Type 类=class(基类) [成员列表] End; 从以上语法可以看出,类类型可以指定一个祖先类型,表示该类型是从这个基类继承下来,如: Type TClass=Class(TObject) 这个例子,声明了一个名叫TClass的类类型,它是从类TObject继承下来的。注意,在Delphi中,类 名一般都是以T打头,以区别于其它数据类型。如果省略了指定基类,则表明直接从TObject继承下来。 成员列表的定义是这样 字段定义 方法定义 属性定义 类类型可以有三类成员分别是字段、方法、特性。字段的声明类型于记录类型中字段的声明,类类 型中的方法又可以分为4类,分别是构造、析构、过程和函数。分别用 Constructor、 Destructor、 Procedure、Function这4个保留字声明,类类型中的特性用保留字Property来声明,一个典型的类类型 示例如下: Type TClass=Class Private FX,FY,FZ:Integer; FS:String[128]; Public Constructor Create(X,Y,Z:Integer;S:string); Destrutor Destroy;override; Procedure Display;Virtual; Function SetStr(const Value:string); Publish Property Caption:String read FS Write SetStr; End; 上例中,声明了4个字段,数据类型分别是Integer和String。在Delphi中,一般私有变量字段都以 F打头。并且声明了一个构造CREATE,一个析构Destroy,一个过程Display,一个函数SetStr。另外还声 明了一个属性Caption。其它的语法元素如Private、Public等将在后面介绍。 注意:跟其它数据类型不同的是,类类型的声明只能出现在程序的Type区,而其它数据类型则可以 在Var区或过程或函数或方法的Begin语句之前声明。因此类类型的作用域总是全局的。 顺便提一下,类类型包括包含类类型分量的构造类型不能作为文件类型的基类型。 三:类类型的字段 类类型中的字段也就是类的数据部分,其声明方法同记录中字段的声明语法相似: 标识符:类型 其中字段的类型可以是各种数据类型,甚至是另一个类类型。 要访问对象的某个字段,跟访问记录变量中的字段类似,是用对象名加小圆点和字段名。 四:类类型的方法 类类型中的方法是个特定的名称,从形式上看也不过是一些过程或函数,不同的是方法是在类类型内部 声明的并只操纵类本身,因此在Object Pascal中方法有其特定含义。我们姑且都称它为方法。 方法的声明和定义 方法定义 方法首部;方法指示字 方法的声明跟变通的过程或函数的声明既相似也有不同的地方,相似的是声明时只需写出方法的首 部,不同的是声明方法时可以加上方法指示字。 方法分为4种

    03

    手动脱壳VMP

    个人在学习脱VMP加壳的过程中总结的一个步骤。按照这个步骤,包括VMP1.6—2.0在内应该有70%-80%能脱壳。脱不了的也别问我,我也刚开始学习。我还想找人问呢。 想要脱VMP的壳,首要工作当然是要找一个强OD啦!至于是什么版本的OD自己多试验几个,网上大把大把的,一般来说只要加载了你想脱的VMP加壳程序不关闭都可以。 其次就是StrongOD.dll这个插件了,现在用的比较多的就是海风月影,同样网上也是大把大把的。下载回来后复制到你的OD程序所在的文件夹里面的plugin里。StrongOD的设置选项搞不懂就全部打钩。 接下来要做的工作就是搞清楚我们要脱壳的程序编程的语言了,可以用PEID或者fastscanner查看,如果在这里看不到也可以在OD载入以后通过里面的字符串判断了。例如VB的程序会出现MSVB----/VC的会出现MSVC---等等。这些都是程序运行所需要的windows链接文件。 做完这些预备工作接下来当然是用OD载入文件啦。文件载入后在反汇编窗口CTRL+G搜索VirtualProtect(注意V跟P要大写,至于为什么要搜索这个别问我)。一般来说搜索的结果会出现以下的类似: 7C801AE3 E8 75FFFFFF call kernel32.VirtualProtectEx 我们在这里下F2断点。然后F9运行到我们下的这个断点。接下来我们就要注意观察堆栈窗口了。一般来说当我们F9运行到我们上面下的断点的时候在堆栈窗口会出现以下类似: 0012F66C 00401000 |Address = TradeCen.00401000 0012F670 000280D1 |Size = 280D1 (164049.) 0012F674 00000004 |NewProtect = PAGE_READWRITE 0012F678 0012FF98 \pOldProtect = 0012FF98 我们要注意观察的就是在接下来我们F9运行的时候,ADDRESS和NEWPROTECT这两行的变化。按F9-速度别太快,直到NewProtect项变为PAGE_READONLY,这时候程序就释放完毕了。 0012F66C 0042A000 |Address = TradeCen.0042A000 0012F670 000069DE |Size = 69DE (27102.) 0012F674 00000002 |NewProtect = PAGE_READONLY 0012F678 0012FF98 \pOldProtect = 0012FF98 现在可以取消刚才我们下的断点了。接下来就是找OEP了。找OEP的时候我个人的一个经验就是OEP一般就在接近上面的ADDRESS地址的附近。例如上面的地址是0042A000,我一般就在这个基础上减到420000搜索程序的特征段,当然我们也可以直接跳到401000开始搜索。虽然我们搜索的范围比较大,但是因为我们搜索的是命令序列,所以工作量还不是很大。 废话不多说,CTRL+G--上面的地址,然后CTRL+S 查找命令序列。命令序列的内容就是我们用查到的编程语言的特征段。我们可以在特征段里面选择两三句固定不变的命令查找。例如VC++6.0的特征段是 0046C07B U> 55 push ebp 0046C07C 8BEC mov ebp,esp 0046C07E 6A FF push -1 0046C080 68 18064C00 push UltraSna.004C0618 0046C085 68 F8364700 push UltraSna.004736F8 0046C08A 64:A1 00000000 mov eax,dword ptr fs:[0] 0046C090 50 push eax 0046C091 64:8925 00000000 mov dword ptr fs:[0],esp 0046C098 83EC 58 sub esp,58 0046C09B 53 push ebx 0046C09C 56 push esi 0046C09D 57 push edi 我们可以只搜索前三条命令。找到符合前三条命令的,我们在对照接下来的命

    02

    DELPHI IDE中部分操作快捷方式

    DELPHI IDE中部分操作快捷方式 1 代码模板 : CTRL+J 2 代码整块移动 : CTRL+SHIFT+I(右移) CTRL+SHIFT+U(左移) 3 选中窗体 : 先选中任一控件,SHIFT+鼠标左键 4 将鼠标指向变量名、单元名、类名,再用 CTRL+鼠标左键 可找到相应的说明 5 在过程、函数、事件内部, SHIFT+CTRL+向上的方向键 可跳跃到相应的过程、函数、事件的定义 6 相反,在过程、函数、事件的定义处,SHIFT+CTRL+向下的方向键 可跳跃到具体过程、函数、事件内部 7 CTRL + SHIFT + C:编写申明或者补上函数 8 SHIFT + CTRL + E 显示 EXPLORER 9 CTRL + SHIFT + N (n=1,2,3,4......)定义书签 10 CTRL + N (n=1,2,3,4......)跳到书签n 11 ALT + 鼠标左键 可以块选代码,删除对齐的重复代码非常有用 12 CTRL + PageUp 将光标移至本屏的第一行,屏幕不滚动。 13 CTRL + PageDown 将光标移至本屏的最后一行,屏幕不滚动。 14 CTRL + ↓ 向下滚动屏幕,光标跟随滚动不出本屏。 15 CTRL + ↑ 向上滚动屏幕,光标跟随滚动不出本屏。 16 CTRL + Home 将光标移至文件头。 17 CTRL + End 将光标移至文件尾。 18 CTRL + B Buffer List窗口。 19 CTRL + I 同Tab键。 20 CTRL + M 同Enter键。 21 CTRL + N 同Enter键,但光标位置保持不变。 22 CTRL + T 删除光标右边的一个单词。 23 CTRL + Y 删除光标所在行。 24 CTRL + SHIFT + ↑ 光标在函数体内时,将光标快速移至当前函数声明处。 25 CTRL + SHIFT + ↓ 光标在函数声明行时,将光标快速移至函数定义处。 26 CTRL + SHIFT + C 声明一个过程或函数后,直接生成过程或函数的名称、begin、end; 27 CTRL + SHIFT + E 光标在Edit窗口和Explorer窗口间切换。 28 CTRL + SHIFT + G 插入GUID。 29 CTRL + SHIFT + J 弹出Delphi语句提示窗口,选择所需语句将自动完成一条语句。 30 CTRL + SHIFT + T 在光标行加入To-Do注释。 31 CTRL + SHIFT + Y 删除光标之后至本行末尾之间的文本。 32 CTRL + F3 Call Stack窗口。 33 CTRL + F4 等于File菜单中的Close项。 34 CTRL + 鼠标转轮 加速滚屏。 35 SHIFT + F8 调试时弹出CPU窗口。 36 SHIFT + F10 等于鼠标右键(Windows快捷键)。 37 ALT + F4 关闭所有编辑框中打开的源程序文件,但不关闭项目。(如无打开项目时,则关闭DELPHI^_^ )

    04
    领券