Проблема заключается в том, что вы вызываете скрипт, используя строку
Invoke-Expression
"C:\MoveAndDeleteFolder.ps1 -startDate $startDate -endDate $endDate"
$startdate
и $enddate
содержит пробелы между датой и временем, поэтому, когда он разобран, дата считается значение параметра, но из-за пробела время считается аргументом. Пример ниже показывает это.
test1.ps1:
param
(
[Datetime]$startDate,
[Datetime]$endDate
)
$startDate| Write-Output
"Args:"
$args
Сценарий:
$startDate = "02/05/2015 19:00"
$endDate = "02/06/2015 14:15"
Write-Host "c:\test.ps1 -startDate $startDate -endDate $endDate"
Invoke-Expression "c:\test.ps1 -startDate $startDate -endDate $endDate"
Выход:
#This is the command that `Invoke-Expression` runs.
c:\test.ps1 -startDate 02/05/2015 19:00 -endDate 02/06/2015 14:15
#This is the failed parsed date
5. februar 2015 00:00:00
Args:
19:00
14:15
Есть два решения здесь. Вы можете запустить скрипт напрямую без Invoke-Expression
, и он отправит объекты должным образом.
c:\test.ps1 -startDate $startDate -endDate $endDate
Выход:
c:\test.ps1 -startDate 02/05/2015 19:00 -endDate 02/06/2015 14:15
5. februar 2015 19:00:00
Или вы могли бы процитировать $startDate
и $endDate
в этом выражении-строки, как:
Invoke-Expression "C:\MoveAndDeleteFolder.ps1 -startDate '$startDate' -endDate '$endDate'"
Честно говоря, Я никогда не понимал, y люди очень заинтересованы в использовании 'Invoke-Expression'. Это очень редко необходимо (так же, как и с «eval», что практически на многих других языках). Это только усложняет ситуацию, отбрасывает все преимущества PowerShell в более простых оболочках и почти никогда не является решением проблемы (просто еще одна проблема). – Joey