2015-02-10 2 views
0

В сценарии powershell я пытаюсь вызвать другой скрипт с двумя параметрами datetime.Pass Datetime to powershell script

Родитель сценарий:

$startDate = "02/05/2015 19:00" 
$endDate = "02/06/2015 14:15" 

Invoke-Expression "C:\MoveAndDeleteFolder.ps1 -startDate $startDate -endDate $endDate" 

Детский сценарий:

param 
(
    [Datetime]$startDate, 
    [Datetime]$endDate 
) 

$startDate| Write-Output 

Результат:

вторник февраля, 10-2015 00:00:00

-> The время потеряно!

Кто-нибудь знает почему?

ответ

2

Проблема заключается в том, что вы вызываете скрипт, используя строку

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'" 
+1

Честно говоря, Я никогда не понимал, y люди очень заинтересованы в использовании 'Invoke-Expression'. Это очень редко необходимо (так же, как и с «eval», что практически на многих других языках). Это только усложняет ситуацию, отбрасывает все преимущества PowerShell в более простых оболочках и почти никогда не является решением проблемы (просто еще одна проблема). – Joey

1

Или попробуйте это:

Invoke-Expression "C:\MoveAndDeleteFolder.ps1 -startDate `"$startDate`" -endDate `"$endDate`"" 
+1

Ничего себе. Я не заметил места. Это ... смущающе. Хороший улов. :) По-прежнему рекомендую избегать 'Invoke-Expression'. По крайней мере, предоставленный образец ему не нужен. –

+0

Это решение работает отлично. спасибо – Alsatian