如何在PowerShell中将DateTime作为参数传递?

时间:2014-12-09 22:18:51

标签: datetime powershell parameters

我有一个脚本,它调用另一个脚本并传入参数。每当我尝试传入日期时间时,日期时间的一部分将用作其他参数的参数。

script1.ps1

$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

script2.ps1

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,它可以正常工作,但我希望能够通过约会。

3 个答案:

答案 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