我有一个脚本,它调用另一个脚本并传入参数。每当我尝试传入日期时间时,日期时间的一部分将用作其他参数的参数。
$dateEnd = Get-Date "12/31/14"
$siteUrl = "http://foo.com"
$outputPath = "c:\myFolder"
$argumentList = "-file .\script2.ps1", "test1", $dateEnd, $siteUrl, $outputPath
Start-Process powershell.exe -ArgumentList $argumentList
param
(
[string]$test1,
[DateTime]$dateEnd,
[string]$siteUrl,
[string]$outputFile
)
$test1
$dateEnd
$siteUrl
$outputFile
Read-Host -Prompt "Press Enter to exit"
这将导致:
test1
Wednesday, December 31, 2014 12:00:00 AM
00:00:00
http://foo.com
编辑 - 字符串作为日期,我的错字:
如果我传递字符串12/31/14
,它可以正常工作,但我希望能够通过约会。
答案 0 :(得分:6)
这是由于位置参数使用和引用的结合。这是一个应该使它工作的变化(引用日期输入):
$argumentList = "-file D:\script2.ps1", "test1", "`"$dateEnd`"", $siteUrl, $outputPath
您是否有任何理由要求单独的PowerShell流程?你可以这样称呼它:
#This will run in separate scope
& ".\script2.ps1" test1 $dateEnd $siteUrl $outputPath
#This will run in the local (current) scope:
. ".\script2.ps1" test1 $dateEnd $siteUrl $outputPath
答案 1 :(得分:4)
在分配$ argumentList的行中,将$ dateEnd参数更改为$dateEnd.toString('s')
。
Windows进程的参数是字符串,而不是对象,因此Start-Process必须将ArgumentList转换为字符串。然后,Powershell.exe通过拆分空格(就像任何Windows进程一样)来解析该字符串,并将其转换回您的参数。
通常,这应该可以很好地工作,但在这种情况下,请注意运行(get-date).tostring()
时会发生什么。 DateTime对象的默认输出包含一个空间,这会干扰解析。
然后,解决方案是将参数列表中的日期参数格式化为没有空格,但仍然采用DateTime :: Parse()可以理解的格式(因此PowerShell可以在另一端重新加载变量) 。将's'
传递给DateTime :: toString()会为您提供这样的格式。
答案 2 :(得分:0)
我认为这是您未正确使用DateTime对象的问题。如果要指定日期,请执行此操作。你建议你的字符串是时间,而不是日期。如果您要指定两者,请同时提供Get-Date。
$endDate = "12/31/14 08:00:00"
那是12月31日上午8点。
然后在你的脚本中调用你想要的任何东西。
param
(
[string]$test1,
[DateTime]$dateEnd,
[string]$siteUrl,
[string]$outputFile
)
$test1
$dateEnd.ToLongDateString()
$dateEnd.ToLongTimeString()
$siteUrl
$outputFile
当DateTime对象传递给它时(此处显示其他测试数据),您应该得到:
test1
Wednesday, December 31, 2014
8:00:00 AM
http://foo.com
C:\myfolder