gpt4 book ai didi

sql - 在 Powershell 中将文件名中的值提取到变量中

转载 作者:行者123 更新时间:2023-12-02 18:39:15 25 4
gpt4 key购买 nike

我有一个 Powershell 脚本,用于从特定文件夹读取 .sql 文件,并根据文件名的名称对数据库运行它们。文件名始终相同:myDatabase.script.SomeRandomCharacters.csv

可能有很多文件,这就是脚本有 foreach 循环的原因。

[CmdletBinding()]
param (
[parameter(Mandatory = $true)][ValidateSet('dev')][String]$serverName,
[parameter(Mandatory = $true)][String]$databaseName,
)

$dir = Split-Path $MyInvocation.MyCommand.Path
$scripts = Get-ChildItem $dir | Where-Object { $_.Extension -eq ".sql" } | Where-Object { $_.Name -like "$databaseName*" }

foreach ($s in $scripts) {
$script = $s.FullName
Invoke-Sqlcmd -ServerInstance $serverName -Database $databaseName -InputFile $script
}

这里的问题是,如果我有 2 个数据库“myDatabase”和“myDatabase2”,则使用前一个输入运行脚本也会运行后者,因为 Where-Object 过滤使用星号。

我不知道如何修改脚本,以便获得文件名中第一个句号之前的绝对值。我还要做的是验证第一个和第二个句号之间的值,在示例文件名中它是 script

感谢任何帮助!

最佳答案

使用数据库名称构建将匹配以下任一内容的正则表达式模式:

param(
[Parameter(Mandatory = $true)][ValidateSet('dev')][String]$ServerName,
[Parameter(Mandatory = $true)][String[]]$DatabaseNames,
)

# Construct alternation pattern like `db1|db2|db3`
$dbNamesEscaped = @($DatabaseNames |ForEach-Object {
[regex]::Escape($_)
}) -join '|'

# Construct pattern with `^` (start-of-string anchor)
$dbNamePattern = '^{0}' -f $dbNamesEscaped

# Fetch scripts associated with either of the database names
$scripts = Get-ChildItem $dir | Where-Object { $_.Extension -eq ".sql" -and $_.Name -match $dbNamePattern }

# ...

关于sql - 在 Powershell 中将文件名中的值提取到变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68282980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com