powershell v2.0从批处理cmd文件传递变量computername参数

时间:2011-05-09 20:09:20

标签: powershell powershell-v2.0

美好的一天

我想设置一个通用脚本,我可以在调用.ps1时从.bat脚本传递服务器名称

在我的蝙蝠脚本中,我有这样的陈述:

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替换为实际的服务器名称,它可以正常工作。只是无法从.ps1中获取.b1文件中的变量。

非常感谢任何帮助。

BobZ

2 个答案:

答案 0 :(得分: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%' "

答案 1 :(得分: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()}