powershell v2.0 从批处理 cmd 文件传递变量计算机名参数
Posted
技术标签:
【中文标题】powershell v2.0 从批处理 cmd 文件传递变量计算机名参数【英文标题】:powershell v2.0 passing variable computername parameter from a batch cmd file 【发布时间】:2011-08-21 23:11:42 【问题描述】:大家好
我想设置一个通用脚本,以便在调用 .ps1 时从 .bat 脚本传递服务器名称
在我的 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 替换为实际的服务器名称,它可以正常工作。只是无法从 .bat 文件中获取要在 .ps1 中识别的变量。
任何帮助将不胜感激。
鲍勃兹
【问题讨论】:
Duplicate question. 【参考方案1】:更新您的脚本以使用参数:
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%' "
【讨论】:
出错了,缺少终结符。稍后我会考虑使用参数。由于我没有提到我将传递倍数,因此我将按照说明使用 arg。 错误可能是引用错误。尝试: "& '\\serverd1\d$\Program Files\%run_dir%\Dcls\PS\Stop_Bkgnd_%run_env%_01.ps1' -server_name %server_name%" (请参阅单引号移回文件名)manojlds 对双引号中的参数是正确的。【参考方案2】:最简单的方法是使用$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()
【讨论】:
非常感谢,这很好用在我的 bat 脚本中,我有这样的声明: set setver_name=our2008server powershell -ExecutionPolicy RemoteSigned -NonInteractive -NoProfile -command "& '\\serverd1\d$\Program文件\%run_dir%\Dcls\PS\Stop_Bkgnd_%run_env%_01.ps1' %server_name%" $Server_name=$args[0] gwmi win32_service -Computername $server_name -filter "name = 'BackgroundQueue'" | % $_.StopService()以上是关于powershell v2.0 从批处理 cmd 文件传递变量计算机名参数的主要内容,如果未能解决你的问题,请参考以下文章
在 CMD 中运行 PowerShell 脚本(带有弹出窗口)
通过批处理文件运行 PowerShell [System.windows.forms.messagebox] 而不显示 cmd 窗口