2017-10-16 3 views
1

私は次のスクリプトを持っていますが、指定されたファイル/パラメータで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 
} 
+0

なぜPSスクリプトで 'cmd/c'を使用していますか? – TheIncorrigible1

+0

/cは本当に必要ではありません...リモートマシンでのサイレントインストール...これはソフトウェアベンダーから与えられた方法です(指定されたスイッチでCLIからインストールする必要があります...そうでなければインストールされません) ...ジャッキー、私は知っている。 –

+0

スクリプトへのすべての引数は、デフォルトでは文字列になります。 '$ args [0]'ではなく、 'Param()'ブロックを使って場所を取得することをお勧めします。私は提案された代替案を投稿します – TheIncorrigible1

答えて

1
Param(
    [Parameter(Position=0,Mandatory)] 
    [String]$Location 
) 

<# ... #> 

& 'C:\Temp\File.exe' Location="$Location" /s >$Null 

代わり:この方法では

$Proc = Start-Process -FilePath 'C:\Temp\File.exe' -ArgumentList @("Location=$Location",'/s') -NoNewWindow -Wait -WindowStyle 'Hidden' -PassThru 

、あなたは終了コードのように、プロセスの詳細をキャプチャすることができ、かつさらにアクションを有する。 $Proc.ExitCode

+0

ありがとうございました! –

関連する問題