簡體   English   中英

Powershell 腳本不會使用給定的參數從 cmd.exe 運行文件

[英]Powershell script won't run file from cmd.exe with given parameters

我有以下腳本,它完成了所有命令,除了運行 cmd.exe 並使用給定的文件/參數......它沒有錯誤,之后它完成了從臨時文件夾中刪除文件。 知道如何通過powershell腳本從命令行使用參數“Location=(用戶選擇的位置代碼)/s”運行“file.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"
}

注意:以下代碼塊工作正常,但設計用於計算機名稱的 .txt 文件,而不是用戶可以單獨輸入位置和計算機 ID 的 GUI:

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
}
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 ,並進行進一步操作,例如$Proc.ExitCode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM