2012-06-08 1 views
1

Я пытаюсь выполнить команду, используя следующий фрагмент кода:

foreach($package in (Get-Childitem *.dtsx | select-object -expand Name)) 
{ 
    DTUTIL /COPY SQL;"\$package" /DESTSERVER "$global:SSISServer" /FILE "$package" /Q 
} 

Однако делать это приводит следующее сообщение об ошибке:

You must provide a value expression on the right-hand side of the '/' operator. 
At C:\Projects\RiskOptix\Code\Deployment\BuildAll.ps1:267 char:39 
+   DTUTIL /COPY SQL;"\$package"/<<<< DESTSERVER "$global:SSISServer" /FILE "$package" /Q 
+ CategoryInfo   : ParserError: (:) [], ParentContainsErrorRecordException 
+ FullyQualifiedErrorId : ExpectedValueExpression 

Я также попытался

& DTUTIL "/COPY SQL;'\" + [System.IO.Path]::GetFileNameWithoutExtension($package) + "' /DESTSERVER '$global:SSISServer' /FILE $package" 

Но теперь это дает мне

Microsoft (R) SQL Server SSIS Package Utilities 
Version 10.50.1600.1 for 32-bit 
Copyright (C) Microsoft Corporation 2010. All rights reserved. 

At least one of the DTS, SQL, or File options must be specified. 

Но, по крайней мере, команда выполнялась, но похоже, что она не получила ни одного из параметров, которые я ее отправил ... Я предполагаю, что существует фундаментальная концепция PowerShell, которую я пропускаю или не понимаю здесь , Где я ошибся?

ответ

1

При передаче переменных в качестве аргументов команды, вам не нужно цитируйте их. Говоря это, похоже, что у вас в вашей команде есть двоеточие. Полуколоны являются необязательными в PowerShell, но, если они присутствуют, используются в качестве разделителя команд. В этом случае вам необходимо процитировать аргумент, который имеет точку с запятой, или создать переменную для этого аргумента:

Get-Childitem *.dtsx | 
    Select-Object -expand Name | 
    ForEach-Object { DTUTIL /COPY "SQL;\$package" /DESTSERVER $global:SSISServer /FILE $package /Q 

Я никогда не использовал diutil, так что не знаю аргументы команд или синтаксис.

+0

Это сработало - я думаю, моя проблема не в том, как параметры передаются команде из PowerShell Спасибо, это сводило меня с ума – blue18hutthutt

1

попробовать Invoke-Expression как:

Invoke-Expression "DTUTIL /COPY SQL;`"\$package`" /DESTSERVER `"$global:SSISServer`" /FILE `"$package`" /Q" 

вся строка оценивается первым и результат затем передается Powershell как обычная команда

+0

Это все еще дает мне ошибку Invoke-Expression: вы должны указать выражение значения в правой части оператора '/'. – blue18hutthutt

+1

try: echo «DTUTIL/COPY SQL;' '\ $ package'"/DESTSERVER '" $ global: SSISServer' "/ FILE' "$ package'/Q" и создавать выходные данные так, как вы будете запускать в win пакет –

+0

На самом деле это дало мне идею - я использовал echo "/ COPY SQL;" "\ $ package" "/ DESTSERVER" "$ global: SSISServer" "/ FILE $ package/Q" | DTUTIL .. и на удивление это сработало. В чем разница между его использованием, таким образом, vs &, vs Invoke-Method, против нескольких строк для каждого параметра например, DTUTIL "/ COPY SQL; '\ $ Package'" "/ DESTSERVRER '$ Server'" "/FILE $ package ""/Q " – blue18hutthutt