2011-05-09 64 views
3

好日子所有的PowerShell 2.0传递变量ComputerName参数从批处理文件CMD

我想建立一个共同的脚本,我可以从.bat脚本调用的.ps1

时传递的服务器名称

在我的蝙蝠脚本我有这样的说法:

set setver_name=our2008server 
powershell -ExecutionPolicy RemoteSigned 
    -NonInteractive 
    -NoProfile 
    -command 
     "& '\\serverd1\d$\Program Files\%run_dir%\Dcls\PS\Stop_Bkgnd_%run_env%_01.ps1' " 
    -server_name %server_name% 

在我的PS1脚本我有:

gwmi win32_service -Computername $server_name -filter "name = 'BackgroundQueue'" | 
    % {$_.StopService()} 

如果我将$ server_name替换为实际的服务器名称,它可以正常工作。只是无法从.bat文件中获取要在.ps1中识别的变量。

任何帮助将不胜感激。

BobZ

+0

[重复的问题](http://stackoverflow.com/questions/5592531/how-to-pass-an-argument-to-this-powershell-script/5596698#5596698)。 – 2011-05-09 20:40:57

回答

1

最简单的方法是使用$args变量。这是一个包含传递给PowerShell脚本的所有参数的数组。

使用范例:

Write-Host "Num Args:" $args.Length; 
foreach ($arg in $args) 
{ 
    Write-Host "Arg: $arg"; 
} 

$args[0] 
$args[1] 

所以,在你的榜样,我会改变command参数读取

// Note the change at the end of this string 
-command "& '\\path\to\my\powershell_script.ps1' %setver_name%" 

,改变PS1文件是

// Note I have used $args[0]. 
gwmi win32_service -Computername $args[0] -filter "name = 'BackgroundQueue'" | 
    % {$_.StopService()} 
+0

非常感谢你,这个效果很好 在我的蝙蝠脚本我有这样的说法: 集setver_name = our2008server PowerShell的-ExecutionPolicy下RemoteSigned -nonInteractive -NoProfile -command “和“\\ serverd1 \ d $ \ Program Files文件\%run_dir%\ DCL的\ PS \ Stop_Bkgnd_%run_env%_01.ps1' %SERVER_NAME% “ $ SERVER_NAME =的$ args [0] gwmi win32_service时-computername $服务器名称筛选器” NAME = 'BackgroundQueue' “| %{$ _ St​​opService()} – BobZ 2011-05-10 13:34:32

4

更新您的脚本使用param:

param($server_name) 
gwmi win32_service -Computername $server_name -filter "name = 'BackgroundQueue'" | 
% {$_.StopService()} 

在呼叫时,将-server_name %server_name%移动到命令中。

set setver_name=our2008server 
powershell -ExecutionPolicy RemoteSigned 
    -NonInteractive 
    -NoProfile 
    -command 
     "& '\\serverd1\d$\Program Files\%run_dir%\Dcls\PS\Stop_Bkgnd_%run_env%_01.ps1 -server_name %server_name%' " 
+0

出现错误,缺少终止符。我稍后会研究使用param。由于我没有提到我会传递倍数,所以我将按照解释的方式使用参数。 – BobZ 2011-05-10 13:32:56

+0

错误可能是错位的报价。请尝试: “&'\\ serverd1 \ d $ \ Program Files \%run_dir%\ Dcls \ PS \ Stop_Bkgnd_%run_env%_01.ps1'-server_name%server_name%” 改为(请参阅单引号移回文件名末尾) manojlds对于双引号内的参数是正确的。 – Jay 2012-01-09 13:48:09

相关问题