使用带有PowerShell脚本的答案文件

时间:2011-07-11 04:27:44

标签: powershell

我有一个PowerShell脚本,开头有很多'params':

param(
    [switch] $whatif,
    [string] $importPath = $(Read-Host "Full path to import tool"),
    [string] $siteUrl = $(Read-Host "Enter URL to create or update"),
    [int] $importCount = $(Read-Host "Import number")
)

我是否可以针对答案文件运行此操作以避免每次都输入参数值?

4 个答案:

答案 0 :(得分:5)

我没有理由提出这个问题。所有你需要做的就是调用你的脚本:

.\script.ps1 -whatif -importPath import_path -siteUrl google.com -importCount 1

Read-Host作为默认值,只有在未指定值时才能执行(然后读取并将值分配给参数)。只要您拥有上述命令(保存在文件中以便您可以复制并粘贴到控制台或从其他脚本或其他任何内容运行),您就不必一次又一次地输入值。

答案 1 :(得分:4)

首先将函数或脚本设置为接受管道输入。

[CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='Low')]
param(
  [Parameter(Mandatory=$True,ValueFromPipelineByPropertyName=$True)]
  [string] $importPath,

  [Parameter(Mandatory=$True,ValueFromPipelineByPropertyName=$True)]
  [string] $siteUrl,

  [Parameter(Mandatory=$True,ValueFromPipelineByPropertyName=$True)]
  [int] $importCount
)

请注意,我删除了您手动创建的-whatif。不需要它 - 我会在一秒钟内完成它。另请注意,如果未提供,则Mandatory = $ True将使PowerShell提示输入值,因此我删除了您的读取主机。

鉴于上述情况,您可以创建一个CSV文件的“答案文件”。在CSV文件中创建importPath列,siteURL列和importCount列:

importPath,siteURL,importCount
"data","data",1
"x","y",2

然后这样做:

Import-CSV my-csv-file.csv | ./My-Script

当然,假设您的脚本是My-Script.ps1。

现在,来看看。在脚本正文中,执行以下操作:

if ($pscmdlet.shouldprocess($target)) {
  # do whatever your action is here
}

这假设您正在为$ target执行某些操作,这可能是路径,计算机名称,URL或其他内容。这是你在脚本中修改的东西。将修改操作/命令放在if构造中。执行此操作以及脚本顶部的SupportsShouldProcess()声明将启用-whatif和-confirm支持。您不需要自己编写这些参数。

您正在构建的内容称为“高级功能”,或者它只是一个脚本而不是我认为它是“高级脚本”。以这种方式利用管道输入参数是“PowerShell的做事方式。”

答案 2 :(得分:0)

据我所知,Powershell对答案文件没有内在的理解。你必须以某种方式传递它们,或者自己从答案文件中阅读它们。

<强>包装即可。您可以编写另一个脚本,该脚本使用您希望每次使用的相同参数调用此脚本。您还可以创建一个包装脚本,从回答文件中读取值,然后将它们传入。

可选参数。或者您可以更改参数以使用指示未传递参数的默认值,然后检查特定名称的文件以从中读取值。如果找不到该文件,则提示输入值。

如果答案文件的格式是灵活的(即,您只是将其与此Powershell脚本一起使用),您可以通过将其写为Powershell来更接近实际答案文件的行为脚本本身和点源。

if (test-path 'myAnswerfile'){
    . 'myAnswerFile'
    #process whatever was sourced from the answer file, if necessary
} else {
    #prompt for values
}

仍然需要从脚本的Read-Host中删除parameters次来电。

答案 3 :(得分:0)

继续来自Joel,您可以根据switch -answerfile设置不同的参数集。

如果设置了该功能,它将查找答案文件并进行解析 - 正如他所说,你需要自己做。如果没有设置,其他的则是函数与给定的参数一起使用。我看到的一个小好处是,当以这种方式使用时,你仍然可以使用必需的参数。

马特