私は次のスクリプトを持っていますが、指定されたファイル/パラメータでcmd.exeを実行する以外はすべてのコマンドを完了します...エラーではなく、後で一時フォルダからファイルを削除します。 powershellスクリプトを使ってコマンドラインから "location =(user-selected location code)/ s"というパラメータを使って "file.exe"を実行する方法はありますか?Powershellスクリプトは、指定されたパラメータでcmd.exeからファイルを実行しません
# Get the Computer ID.
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.Text = "'Enter Computer ID"
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = "CenterScreen"
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Point(150,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = "Please enter the Computer ID."
$form.Controls.Add($label)
$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,40)
$textBox.Size = New-Object System.Drawing.Size(260,20)
$textBox.MaxLength = 8
$form.Controls.Add($textBox)
$form.Topmost = $True
$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$Machine = $textBox.Text
$Machine
}
# Get the Location Code.
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form1 = New-Object System.Windows.Forms.Form
$form1.Text = "Select a Location"
$form1.Size = New-Object System.Drawing.Size(190,250)
$form1.StartPosition = "CenterScreen"
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(10,180)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form1.AcceptButton = $OKButton
$form1.Controls.Add($OKButton)
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Point(85,180)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = "Please select a Location Code:"
$form.Controls.Add($label)
$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(10,40)
$listBox.Size = New-Object System.Drawing.Size(150,20)
$listBox.Height = 140
[void] $listBox.Items.Add("01")
[void] $listBox.Items.Add("02")
[void] $listBox.Items.Add("03")
[void] $listBox.Items.Add("04")
[void] $listBox.Items.Add("06")
[void] $listBox.Items.Add("07")
$form1.Controls.Add($listBox)
$form1.Topmost = $True
$result1 = $form1.ShowDialog()
if ($result1 -eq [System.Windows.Forms.DialogResult]::OK)
{
$Server = $listBox.SelectedItem
$Server
}
# Ensure the Computer ID is available on the Network before continuing.
IF (Test-Connection -ComputerName $Machine -Count 1){
Try {
$destination = "\\" + $Machine + "\C$\temp\"
$source = "\\server\location\folder\file name 1.1.EXE"
New-Item -Path $destination -ItemType Directory -Force
Copy-Item -Path $source -Destination $destination -Force | Out-Null
Invoke-Command -ComputerName $Machine -ArgumentList $Server -ScriptBlock {
$file = "C:\temp\file name 1.1.EXE"
$renfile = "C:\temp\file.exe"
$execfile = "C:\temp\file.exe Location="+($args[0]).ToString()+" /s"
Rename-Item $file $renfile
& cmd.exe /c $execfile | Out-Null
Remove-Item $renfile -Force
}
$status = "Success"
}
Catch {
$status = "Failed"
}
"$Machine, $status" | out-file -filepath c:\temp\result2.csv -Append -Encoding ascii
}
ELSE{
#Sets status to "Not on Network" if the Test-Connection failed. Indicates the PC is not on the Network currently"
$status = "Not on Network"
}
注:ユーザーが個々に位置し、コンピュータIDを入力することができるGUIとは対照的に、次のコードブロックは、正常に動作するが、コンピュータ名の.txtファイルのために設計されている:
Get-Content C:/temp/faillist.txt |
ForEach-Object {
Try {
$source = "\\server\location\folder\file name 1.1.EXE"
$destination = "\\" + $_ + "\C$\temp\"
New-Item -Path $destination -ItemType Directory -Force
Copy-Item -path $source -Destination $destination -force | Out-Null
Invoke-Command -ComputerName $_ -ScriptBlock {
& cmd.exe /c "C:\temp\file name 1.1.EXE" Location=02 /s | Out-Null
}
$file = $destination + "file name 1.1.EXE"
Remove-Item $file -Force
$status = "Success"
}
Catch {
$status = "Failed"
}
"$_, $status" | out-file -filepath c:\temp\result2.csv -Append -Encoding ascii
}
なぜPSスクリプトで 'cmd/c'を使用していますか? – TheIncorrigible1
/cは本当に必要ではありません...リモートマシンでのサイレントインストール...これはソフトウェアベンダーから与えられた方法です(指定されたスイッチでCLIからインストールする必要があります...そうでなければインストールされません) ...ジャッキー、私は知っている。 –
スクリプトへのすべての引数は、デフォルトでは文字列になります。 '$ args [0]'ではなく、 'Param()'ブロックを使って場所を取得することをお勧めします。私は提案された代替案を投稿します – TheIncorrigible1