簡體   English   中英

從 Powershell 中的文件名中提取值到變量中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM