2012-04-06 18 views
1

現在、私はユーザー名のリストを読み込んでエコーするfollow psを持っています。同じ行にエコーが出るようなpowershellループを作るにはどうすればいいですか?

ユーザ名のファイルは、次の

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' 

どうすればこの問題を解決できますか?

答えて

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の素晴らしい機能です。これは文字列リテラルの変数置換です。 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') 

これは、はるかに快適です

も... は、私はちょうど全体のことは、以下に減らすことができる実現しましたスクリプト私の意見ではクエリ:)

+0

これはまさに私が探していたトリックです。 userID = 'username1'が表示されます。どのように私は1の後にスペースを取り除くことができますか? – mhopkins321

+0

@ mhopkins321 - 上記の私の編集を参照 – Josh

関連する問題