我正在寻求有关如何使用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%
有什么建议吗?
答案 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 /c
或cmd /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)