将应答文件与PowerShell脚本一起使用
我有一个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") )
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的新手,不知道您可以这样做。我会试着回来。