[英]Extract values into variables from filename in Powershell
我有一個 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 }
# ...
您可以使用StartsWith
函數來修復您的過濾器:
$scripts = Get-ChildItem $dir | Where-Object { $_.Extension -eq ".sql" } | Where-Object { $_.Name.StartsWith("$($databaseName).") }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.