1

現在、ユーザー名のリストを読み取り、それをエコーする次の ps があります。

ユーザー名ファイルは次のとおりです

username1
username2
username3

psスクリプトは次のとおりです

$userNames = (Get-Content usernames.txt)# | Sort-Object
$userID=0
$userNames.Count
echo "FROM table WHERE (userID ='"
For ($i =1; $i -le ($userNames.Count - 1); $i++)
{
echo $userNames[$userID] "' OR userID='"
$userID++
}
echo $userNames[$userNames.Count - 1] "'"

これをすべて同じ行でエコーする(そして最終的にテキストファイルに書き込む)ことを望んでいます。

FROM table WHERE (userID = 'username1' OR userID = 'username2' OR userID = 'username3'

これを解決するにはどうすればよいですか?

4

1 に答える 1

6

あなたが探しているものは次のとおりです。

Write-Host "Blah" -NoNewLine

おそらく、このようにスクリプトを書き直して、For...Loop

$userNames = (Get-Content usernames.txt) | Sort-Object
$count = 0

Write-Host "FROM table WHERE (" -NoNewLine

$userNames |% {
    Write-Host "userID='$_'" -NoNewLine

    if(++$count -ne $userNames.Length){
        Write-Host " OR " -NoNewLine
    }
    else {
        Write-Host ")"
    }
}

このスクリプトは、文字列リテラルの変数置換という PowerShell のもう 1 つの優れた機能も利用します。For-EachObject反復中に自動的に現在のオブジェクトに設定$_され、PowerShell は文字列リテラルの変数を自動的に解析し、それらの値を置き換えます。

また...全体を次のように削減できることに気付きました。

$userNames = (Get-Content usernames.txt) | Sort-Object |% { "'$_'" }

Write-Host "FROM table WHERE UserID in ($([String]::Join(",",$userNames)))"

次のクエリが生成されます。

FROM table WHERE UserID in ('username1','username2','username3')

私の意見では、これははるかに快適なスクリプトクエリです:)

于 2012-04-06T15:30:33.093 に答える