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 窗口

从 powershell 脚本运行 cmd 命令

从CMD管道到PowerShell

路径中的.cmd与.ps1

将 powershell 输出存储在 CMD 中的变量中