如何从命令行调用 PowerShell 脚本中的特定函数?
How to call specific function in PowerShell script form Command Line?
我想从命令行调用我的 powershell 脚本中的特定函数。但它 return 我这样的错误:
键不能为空。
Parameter name: key
$Get = $ini_file.($a_section).($b_node)
Key cannot be null.
Parameter name: key
$Output = $ini_file.($a_section).($b_node) | Out-File $Store\Val ...
这是我的代码:
Param(
[Parameter(Mandatory=$true)]
[string]$FilePath,
$ini, $a_section, $b_node, $c_store,
$a, $b, $c
)
function Get-File {
$input_file = $FilePath
$ini_file = @{}
Get-Content $input_file | ForEach-Object {
$_.Trim()
} | Where-Object {
$_ -notmatch '^(;|$)'
} | ForEach-Object {
if ($_ -match '^\[.*\]$') {
$section = $_ -replace '\[|\]'
$ini_file[$section] = @{}
} else {
$key, $value = $_ -split '\s*=\s*', 2
$ini_file[$section][$key] = $value
}
}
$Get = $ini_file.($a_section).($b_node)
$Store = $c_store
$Output = $ini_file.($a_section).($b_node) | Out-File $Store\Value.cmd
}
function Write-File {
Import-Module PsIni
$ff = Get-IniContent $FilePath
$ff["$a"]["$b"] = "$c"
$ff | Out-IniFile -FilePath $FilePath -Force
}
# Calling the function with the global parameter $FilePath
Write-File $FilePath $a $b $c
Get-File $FilePath $ini $a_section $b_node $c_store
我从命令行调用每个函数的方式是:
调用函数Get-File
:
powershell.ps1 Get-File -FilePath C:\User\file.ini -a_section Information -b_node Name -c_store C:\User\
如果我运行那个命令,我仍然可以得到value
的INI文件,但是它return是上面的错误。如果我删除这部分 Write-File $FilePath $a $b $c
它不会 return 任何错误。
看来我不能同时使用"calling the function"。但我不确定。
我的 INI 文件
[Information]
Name=Joyce
Age=12
更新代码:
Function Read-File
{
Param(
[parameter(mandatory=$true)]$FilePath,
[parameter(mandatory=$true)] $ini,
[parameter(mandatory=$true)] $a_section,
[parameter(mandatory=$true)] $b_node,
[parameter(mandatory=$true)] $c_store
)
$input_file = $FilePath
$ini_file = @{}
Get-Content $input_file | ForEach-Object {
$_.Trim()
} | Where-Object {
$_ -notmatch '^(;|$)'
} | ForEach-Object {
if ($_ -match '^\[.*\]$') {
$section = $_ -replace '\[|\]'
$ini_file[$section] = @{}
} else {
$key, $value = $_ -split '\s*=\s*', 2
$ini_file[$section][$key] = $value
}
}
$Get = $ini_file.($a_section).($b_node)
$Store = $c_store
$Output = $ini_file.($a_section).($b_node) | Out-File $Store\Value.cmd
}
#---------------------------------------------------------------#
Function Write-File
{
Param(
[parameter(mandatory=$true)]$FilePath,
[parameter(mandatory=$true)] $a,
[parameter(mandatory=$true)] $b,
[parameter(mandatory=$true)] $c
)
Import-Module PsIni
$ff = Get-IniContent $FilePath
$ff["$a"]["$b"] = "$c"
$ff | Out-IniFile -FilePath $FilePath -Force
}
$cmd, $params = $args
& $cmd @params
您尝试调用该函数的方式不起作用,因为您将参数传递给脚本,但从未对它们执行任何操作。如果您希望在脚本运行时自动调用函数 运行 从脚本中调用函数。
function Write-IniFile {
Param(
...
)
...
}
Write-IniFile -FilePath C:\Users\file.ini -a Name -b Joyce -c 1309
和运行脚本是这样的:
PS.ps1
否则在调用函数之前点源脚本:
. PS.ps1
Write-IniFile -FilePath C:\Users\file.ini -a Name -b Joyce -c 1309
如果您希望能够 运行 带有参数的脚本并将这些参数传递给函数,请使用第一种方法,但在函数上 splat $args
:
function Write-IniFile {
Param(
...
)
...
}
Write-IniFile @args
并像这样调用脚本:
PS.ps1 -FilePath C:\Users\file.ini -a Name -b Joyce -c 1309
编辑:
如果您有一个具有多个功能的脚本,并且希望能够通过 运行 调用脚本中的任何一个,您可以 split'n'splat脚本参数:
PS.ps1
:
function Foo {
Param(
[Parameter(Mandatory=$true)]
$x
)
...
}
function Bar {
Param(
[Parameter(Mandatory=$true)]
$y,
[Parameter(Mandatory=$true)]
$z
)
...
}
$cmd, $params = $args
& $cmd @params
调用:
PS.ps1 Foo -x 'some' # invoke Foo() with the given arguments
PS.ps1 Bar -y 'or' -z 'other' # invoke Bar() with the given arguments
声明
$cmd, $params = $args
将第一个参数分配给变量 $cmd
,将其余参数分配给变量 $params
。下一条语句
& $cmd @params
通过 call operator (&
) and splats $params
中的参数调用 $cmd
。
我想从命令行调用我的 powershell 脚本中的特定函数。但它 return 我这样的错误: 键不能为空。
Parameter name: key $Get = $ini_file.($a_section).($b_node) Key cannot be null. Parameter name: key $Output = $ini_file.($a_section).($b_node) | Out-File $Store\Val ...
这是我的代码:
Param(
[Parameter(Mandatory=$true)]
[string]$FilePath,
$ini, $a_section, $b_node, $c_store,
$a, $b, $c
)
function Get-File {
$input_file = $FilePath
$ini_file = @{}
Get-Content $input_file | ForEach-Object {
$_.Trim()
} | Where-Object {
$_ -notmatch '^(;|$)'
} | ForEach-Object {
if ($_ -match '^\[.*\]$') {
$section = $_ -replace '\[|\]'
$ini_file[$section] = @{}
} else {
$key, $value = $_ -split '\s*=\s*', 2
$ini_file[$section][$key] = $value
}
}
$Get = $ini_file.($a_section).($b_node)
$Store = $c_store
$Output = $ini_file.($a_section).($b_node) | Out-File $Store\Value.cmd
}
function Write-File {
Import-Module PsIni
$ff = Get-IniContent $FilePath
$ff["$a"]["$b"] = "$c"
$ff | Out-IniFile -FilePath $FilePath -Force
}
# Calling the function with the global parameter $FilePath
Write-File $FilePath $a $b $c
Get-File $FilePath $ini $a_section $b_node $c_store
我从命令行调用每个函数的方式是:
调用函数Get-File
:
powershell.ps1 Get-File -FilePath C:\User\file.ini -a_section Information -b_node Name -c_store C:\User\
如果我运行那个命令,我仍然可以得到value
的INI文件,但是它return是上面的错误。如果我删除这部分 Write-File $FilePath $a $b $c
它不会 return 任何错误。
看来我不能同时使用"calling the function"。但我不确定。
我的 INI 文件
[Information] Name=Joyce Age=12
更新代码:
Function Read-File
{
Param(
[parameter(mandatory=$true)]$FilePath,
[parameter(mandatory=$true)] $ini,
[parameter(mandatory=$true)] $a_section,
[parameter(mandatory=$true)] $b_node,
[parameter(mandatory=$true)] $c_store
)
$input_file = $FilePath
$ini_file = @{}
Get-Content $input_file | ForEach-Object {
$_.Trim()
} | Where-Object {
$_ -notmatch '^(;|$)'
} | ForEach-Object {
if ($_ -match '^\[.*\]$') {
$section = $_ -replace '\[|\]'
$ini_file[$section] = @{}
} else {
$key, $value = $_ -split '\s*=\s*', 2
$ini_file[$section][$key] = $value
}
}
$Get = $ini_file.($a_section).($b_node)
$Store = $c_store
$Output = $ini_file.($a_section).($b_node) | Out-File $Store\Value.cmd
}
#---------------------------------------------------------------#
Function Write-File
{
Param(
[parameter(mandatory=$true)]$FilePath,
[parameter(mandatory=$true)] $a,
[parameter(mandatory=$true)] $b,
[parameter(mandatory=$true)] $c
)
Import-Module PsIni
$ff = Get-IniContent $FilePath
$ff["$a"]["$b"] = "$c"
$ff | Out-IniFile -FilePath $FilePath -Force
}
$cmd, $params = $args
& $cmd @params
您尝试调用该函数的方式不起作用,因为您将参数传递给脚本,但从未对它们执行任何操作。如果您希望在脚本运行时自动调用函数 运行 从脚本中调用函数。
function Write-IniFile {
Param(
...
)
...
}
Write-IniFile -FilePath C:\Users\file.ini -a Name -b Joyce -c 1309
和运行脚本是这样的:
PS.ps1
否则在调用函数之前点源脚本:
. PS.ps1
Write-IniFile -FilePath C:\Users\file.ini -a Name -b Joyce -c 1309
如果您希望能够 运行 带有参数的脚本并将这些参数传递给函数,请使用第一种方法,但在函数上 splat $args
:
function Write-IniFile {
Param(
...
)
...
}
Write-IniFile @args
并像这样调用脚本:
PS.ps1 -FilePath C:\Users\file.ini -a Name -b Joyce -c 1309
编辑:
如果您有一个具有多个功能的脚本,并且希望能够通过 运行 调用脚本中的任何一个,您可以 split'n'splat脚本参数:
PS.ps1
:
function Foo {
Param(
[Parameter(Mandatory=$true)]
$x
)
...
}
function Bar {
Param(
[Parameter(Mandatory=$true)]
$y,
[Parameter(Mandatory=$true)]
$z
)
...
}
$cmd, $params = $args
& $cmd @params
调用:
PS.ps1 Foo -x 'some' # invoke Foo() with the given arguments
PS.ps1 Bar -y 'or' -z 'other' # invoke Bar() with the given arguments
声明
$cmd, $params = $args
将第一个参数分配给变量 $cmd
,将其余参数分配给变量 $params
。下一条语句
& $cmd @params
通过 call operator (&
) and splats $params
中的参数调用 $cmd
。