将应答文件与PowerShell脚本一起使用

将应答文件与PowerShell脚本一起使用,powershell,Powershell,我有一个PowerShell脚本,开头有许多“参数”: 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") )

我有一个PowerShell脚本,开头有许多“参数”:

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")
)

是否有任何方法可以对应答文件运行此操作以避免每次输入参数值?

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

包装器。您可以编写另一个脚本,使用每次都要使用的相同参数调用此脚本。您还可以制作一个包装器脚本,从应答文件中读取值,然后将它们传入

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

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

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

它仍然需要从脚本的
参数
中删除
读取主机
调用。

我不知道问题的原因。调用脚本所需的全部操作如下:

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

读取主机
是默认设置,只有在未指定值的情况下才会执行(然后读取并将值分配给参数)。只要您拥有上述comand(保存在一个文件中,以便您可以复制并粘贴到console或从另一个脚本或任何东西运行),您就不必反复输入值。

继Joel之后,您可以根据switch-answer文件设置不同的参数集

如果设置了,函数将查找一个应答文件并对其进行解析——正如他所说的,您需要自己进行解析。如果未设置该函数,而其他函数已设置,则函数将与给定的参数一起使用。我看到的一个小好处是,当以这种方式使用时,仍然可以强制使用参数


Matt

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

[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的工作方式”。

我是PowerShell的新手,不知道您可以这样做。我会试着回来。