如何使用powershell脚本中的参数调用可执行文件

时间:2014-01-29 16:33:58

标签: powershell powershell-v2.0

我正在寻求有关如何使用powershell脚本调用具有特定参数的cmd的帮助。到目前为止,我所写的内容如下,但它给出了一条错误消息,指出$ _cmd无法识别。

我正试图将日期和日期传递给一个exe ...从你可以看到的日期到今天需要 - 1和迄今为止应该是。可执行文件的路径是D:\ DataService,这就是我在脚本中提前设置路径的原因。

    Write-Host "Get data from service"

$path ="D:\DataService"

Push-Location $path
$Date = Get-Date
$DateFrom = $Date.ToString("yyyy-MM-dd HH:mm:ss")
$DateTo = $Date.AddDays(-1).ToString("yyyy-MM-dd")
$_cmd = "ReportGen.exe -ReportType Data -DateFrom $DateFrom $DateTo"

%$_cmd%

有什么建议吗?

6 个答案:

答案 0 :(得分:9)

不要创建命令字符串。只需使用调用运算符(&):

Write-Host 'Get data from service'

$path = 'D:\DataService'

Push-Location $path

$Date     = Get-Date
$DateFrom = $Date.ToString('yyyy-MM-dd HH:mm:ss')
$DateTo   = $Date.AddDays(-1).ToString('yyyy-MM-dd')

& ReportGen.exe -ReportType Data -DateFrom $DateFrom $DateTo

答案 1 :(得分:3)

您希望根据以下评论使用Invoke-Expression

Invoke-Expression $_cmd

原始评论,这是错误的:

你有没有尝试在前面放一个&符号。 e.g:

& $_cmd

不确定您使用%字符的原因。

答案 2 :(得分:2)

%$_cmd%看起来像是PowerShell和cmd语法的混合体。 %没有特别的意义。 PowerShell将其解释为命令的文字名称,当然这是不可识别的。要执行字符串的内容,请使用

Invoke-Expression $_cmd

但是,只有当 ReportGen.exe 在路径中时才会有效,并且cmd甚至不参与,因为您没有在任何地方调用它。如果由于某种原因,正如您所说,您特别想要使用cmd执行该命令,则应在开头添加cmd /ccmd /k。但是,您甚至不需要分配字符串,只需直接调用cmd:

cmd /c ReportGen.exe -ReportType Data -DateFrom $DateFrom $DateTo

/c表示执行命令后cmd将退出。 /k表示执行命令后cmd提示符将保持打开状态。您可能需要/c,以便在执行脚本后返回PowerShell提示符。

答案 3 :(得分:2)

一些事情。一,停止使用Write-Host。老实说,让这是你最后一次使用它(除非你真的需要它 - 并且知道你为什么需要它)。相反,使用Write-Output - 即使您知道您的脚本将在控制台中运行。其次,您还可以考虑使用Start-Process cmdlet及其参数-ArgumentList。

答案 4 :(得分:2)

你的$ DateFrom和$ DateTo似乎是倒退的,因为你将$ DateTo设置为昨天。因此,除非你从今天到昨天,否则你可能想要调整它。此外,您指定起始日期,但只是在最后添加日期,不确定是否需要指定它是什么,或者两个日期是否是同一参数的一部分。至于运行带参数的命令,请使用带有参数逗号分隔的Invoke-Command:

Invoke-Command -FilePath "D:\DataService\ReportGen.exe" -ArgumentList '-ReportType Data','-DateFrom $DateFrom','$DateTo'

答案 5 :(得分:1)

我会这样做。

$CustomProcess = New-Object System.Diagnostics.ProcessStartInfo
$CustomProcess.FileName = "ReportGen.exe"
$CustomProcess.arguments = "-ReportType Data -DateFrom $DateFrom $DateTo"
[System.Diagnostics.Process]::Start($CustomProcess)