2013-12-18 4 views
4

Я пытаюсь выполнить скрипт PowerShell из сценария Perl и запутать некоторые ошибки. Скрипт работает как служба Windows в окне Windows Server 2012. То, что я пытаюсь сделать, - определить, существует ли почтовый ящик Exchange для пользователя. Предыдущий код Perl был написан так, чтобы он мог подключаться к Exchange 2003, который работает в течение многих лет. Теперь мы обновляемся до Exchange 2013 и должны обновить код, чтобы он вызывал сценарий PowerShell для выполнения этой задачи. Сценарий PowerShell проверяет, имеет ли пользователь почтовый ящик и возвращает строку, если это произойдет.Выполнение сценария PowerShell из скрипта Perl

код Perl

sub mailboxExists 
{ 
    my ($argstr) = @_; 
    my ($username) = parseArgs($argstr); 

    # Get the user's dn 
    my $dn = userExists($username); 
    if(!$dn) 
    { 
    print $CLIENT "ERR User does not exist, so mailbox can not\n"; 
    return undef; 
    } 

    # Search 

    $result = 'C:\Windows\System32\PowerShell\v1.0\powershell.exe -command "C:\LDIAD\PS\mailboxExists.ps1 $username"'; 
} 

PowerShell сценарий - в настоящее время тестирования с помощью Exchange 2007, как мы уже не развертываются 2013, но пока код будет в основном то же самое.

#Add the Exchange 2007 snapins 
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin 
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Support 

#Start the script 
$user = Get-User -Identity $username 
If ($user.RecipientType -eq "UserMailbox") 
{ 
"1" 
} 
Else 
{ 
"0" 
} 

Код PowerShell работает очень хорошо, я думаю, что проблема заключается в моей команде в Perl для вызова сценария PS? Мое знание Perl очень ограничено. Это код от сотрудника, которого больше нет здесь. Я добавил только строку, которая должна выполнять скрипт PowerShell.

+0

Короткий ответ: используйте обратные такты, как '' $ result = 'command';' 'для выполнения' command', но есть более гибкие и безопасные способы. – amon

+0

Можете ли вы поделиться более гибкими и безопасными способами? Я очень открыт для предложений, чтобы сделать это лучше. – Kenny

ответ

1

одиночную кавычку, двойные кавычки и обратные кавычки все имеют разные и конкретные значения в Perl, и их запутывание заставит вашу программу вести себя непредсказуемым образом.

для текста внутри "double quotes", Perl интерполирует переменные и переосмысливает символы предшествуют обратной косой черты

$foo = "bar"; 
print "\t$foo\n";  # outputs: <TAB> bar <NEWLINE> 

Внутри 'single quotes', Perl не интерполировать переменные, и рассматривает обратную косую черту в качестве буквального обратной косой черты, если она не сопровождается либо другой обратный слэш или символ одиночной кавычки. Используйте их, чтобы передать Perl для обработки текста внутри цитат буквально.

$foo = "bar"; 
print '\t$foo\n';  # outputs: <BACKSLASH> t <DOLLAR> foo <BACKSLASH> n 

Для текста внутри обратных ссылок (извините, разметка недоступна) Perl выполняет две функции. (1) переинтерпретировать строку так, как если бы она находилась внутри двойных кавычек (интерполировать переменные, заменить экранированные последовательности символов) и (2) передать полученную строку в операционную систему в качестве команды для запуска, возвращая результат команды

$foo = "bar"; 
print `ls /tmp/$foo 2>&1`; 
# possible output: ls: cannot access /tmp/bar: No such file or directory 


Назад к первоначальному вопросу: вы хотите запустить команду

C:\Windows\System32\PowerShell\v1.0\powershell.exe -command "C:\LDIAD\PS\mailboxExists.ps1 $username" 

на вашей операционной системе, где «$username» заменяется на значение строки переменной Perl $username, и вы хотите назначить вывод этой команды переменной $result.Вот несколько способов сделать что:

  1. Используйте интерполирования обратные кавычки, спасаясь \

    $result = `C:\\Windows\\System32\\PowerShell\\v1.0\\powershell.exe -command "C:\\LDIAD\\PS\\mailboxExists.ps1 $username"`; 
    
  2. Используйте одинарные кавычки, чтобы присвоить буквенные строки для временных переменных

    my $powershell = 'C:\Windows\System32\PowerShell\v1.0\powershell.exe'; 
    my $mboxScript = 'C:\LDIAD\PS\mailboxExists.ps1'; 
    $result = `$powershell -command "$mboxScript $username"`; 
    
0

Попробуйте запустить как

$scriptpath="C:\LDIAD\PS\mailboxExists.ps1 $username"; 
$exepath = "C:\Windows\System32\PowerShell\v1.0\powershell.exe"; 

Затем используйте либо

$result = `$exepath -File $scriptpath`; 

или

system("$exepath -File $scriptpath"); 
0

На окна 7, следующие работы. Да, требуется большая очистка, но она работает для меня на данный момент.

$constant = "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe"; 
$param1 = " -psc "; 
$param2 = "\"C:\\Program\ Files\ (x86)\\VMware\\Infrastructure\\vSphere\ PowerCLI\\vim.psc1\" -noe -c"; 
$param3 = " \". \\\"C:\\Program\ Files\ (x86)\\VMware\\Infrastructure\\vSphere\ PowerCLI\\Scripts\\Initialize-PowerCLIEnvironment.ps1\\\"\""; 

$test = $param1.$param2.$param3; 
open (IN, "| \"$constant\" $test") or die "$!"; 
+0

Добро пожаловать в переполнение стека. Пожалуйста, прочитайте [Переполнение стека: как ответить] (http://stackoverflow.com/questions/how-to-answer) –

Смежные вопросы