0

PowerShell で非常に簡単なスクリプトを作成しています。このスクリプトの目的は、txt ファイルからサーバー名のリストを読み取り、別の txt ファイルからコマンド ブロックを読み取ることです。操作の結果は、情報を含む 3 番目の txt ファイルになります。

ここにいくつかのコード:

cls
$usr = Read-Host "Please insert username, you'll be asked for password later"
$path = Read-Host "Insert a valid path for ServerList.txt file"
$serverList = Get-Content -Path $path | Out-String

$path = Read-Host "Insert a valid path fom Command.txt file"
$commandBlock = Get-Content -Path $path | Out-String


echo "Command: " $commandBlock "will be executed on " $serverList
echo "Press CTRL+Z to abort or"
pause

Invoke-Command -ComputerName $serverList -ScriptBlock { $commandBlock } -credential $usr 

Serverlist.txt は「server1,server2,server3」などを含むプレーン テキストであり、command.txt はこの「Get-WmiObject Win32_BIOS | Select-Object SerialNumber」のみを含みます。

エラーが Invoke-Command である理由: 1 つ以上のコンピューター名が無効です。URI を渡す場合は、-ConnectionUri パラメーターを使用するか、文字列の代わりに URI オブジェクトを渡します。?

$serverlist を $serverlist.toString() に置き換えようとしましたが、うまくいきません。この場合、$serverlist は配列であるとどこかで読みましたが、すべてを機能させるにはどうすればよいですか?

https://technet.microsoft.com/en-us/library/hh849719.aspxコンソール経由で文字列を配置する場合、Invoke-Commands は「server1,server2,server3」形式で機能することを考慮してください。

4

2 に答える 2

1

これが期待どおりに機能しない理由をさらに理解するには、解析およびコマンド構文のヘルプ ファイルを参照してください。

Get-Help about_Parsing
Get-Help about_Command_Syntax

$サーバーリスト

テキスト ファイルに次の行が含まれている場合server1,server2,server3、このコマンドは次のようになります。

Get-Content -Path .\file.txt | Out-String

文字列server1,server2,server3と改行だけが返されます - これは有効なホスト名ではありません。

テキスト ファイルを次のようにフォーマットします (Get-Content改行で自動的に分割されます)。

server1
server2
server3

または、ファイルから文字列を自分で分割します。

$Serverlist = Get-Content -Path $Path | ForEach-Object { $_ -split "," }

$コマンドブロック

コマンド ブロック部分が機能するためには、文字列を ScriptBlock にドロップして実行することを期待することはできません。実行可能コードとして再作成する必要があります。

$Code = Get-Content -Path $path -Raw
$CommandBlock = [scriptblock]::Create($Code)

# Now you can do this
Invoke-Command -ScriptBlock $CommandBlock
于 2015-07-20T13:37:24.947 に答える