启动命令行来自linqpad,不能从我的可执行文件中工作

时间:2014-11-08 00:05:38

标签: c# .net command-line .net-4.5

我面临着一个非常奇怪的问题,我尝试使用以下代码从程序启动命令,它在linqpad中工作,如果我复制粘贴在一个独立的.exe中的相同代码.exe它不再有效:

var cmd = "/K convert \"c:\\TesseractInput\\46a8c74d-ead1-4a6a-987f-a46b146cb58b.png\" \"c:\\TesseractOutput\\46a8c74d-ead1-4a6a-987f-a46b146cb58b.tif\"";
var proc = Process.Start("CMD.exe", cmd);
proc.WaitForExit(20000);

在linqpad中,我最终得到一个命令提示符,并正确执行了我的命令。在我的独立exe中,我最终得到一个命令promt,并带有错误说明

Invalid Parameter - "c:\TesseractOutput\46a8c74d-ead1-4a6a-987f-a46b146cb58b.tif"

这不是我调用的程序特有的(与其他命令行程序有同样的问题)

如果我使用sysinternal的processexplorer检查进程,我会看到cmd.exe是使用正确传递的参数启动的,而从我的程序启动的那个会给出路径"错误打开过程"。

linqpad和我的exe都以同一个用户(我自己,管理员)的身份运行

我调查了很长一段时间并且没有取得任何进展,任何建议都非常受欢迎,因为这是阻止部署(最后一步是将我在linqpad中执行的外部Tools dev合并到我的程序中)

更新:aaaaaaaaaaaaaa并且现在没有改变任何东西。 。 。作品。 有什么可能导致这种情况的线索?

2 个答案:

答案 0 :(得分:1)

命令提示可以作为不同的用户运行,并且可以使用不同的路径环境变量运行 - 路径环境变量是windows搜索convert.exe的地方;通常它会检查当前文件夹,然后检查路径语句中的文件夹。 http://en.wikipedia.org/wiki/PATH_(variable)我没有你的转换程序,但是当我运行下面的程序时,我遇到了同样的错误。

C:\Users\user1>convert c:\temp\1.png c:\temp\2.tif
Invalid Parameter - c:\temp\2.tif

C:\Users\user1>convert /?
Converts a FAT volume to NTFS.

CONVERT volume /FS:NTFS [/V] [/CvtArea:filename] [/NoSecurity] [/X]


  volume      Specifies the drive letter (followed by a colon),
              mount point, or volume name.
  /FS:NTFS    Specifies that the volume will be converted to NTFS.
  /V          Specifies that Convert will be run in verbose mode.
  /CvtArea:filename
              Specifies a contiguous file in the root directory
              that will be the place holder for NTFS system files.
  /NoSecurity Specifies that the security settings on the converted
              files and directories allow access by all users.
  /X          Forces the volume to dismount first if necessary.
              All open handles to the volume will not be valid.

C:\Users\user1>

答案 1 :(得分:0)

您正在运行Windows convert命令,它将FAT卷转换为NTFS。指定convert.exe文件的路径

var cmd = @"/K c:\mypath\convert c:\temp\1.png c:\temp\2.tif";
var proc = Process.Start("CMD.exe", cmd);
proc.WaitForExit(20000);