เรียกใช้คำสั่ง CMD ใน PowerShell


87

ฉันมีปัญหามากมายในการเรียกใช้คำสั่ง PowerShell สิ่งที่ทำคือเรียกใช้คำสั่งที่จะเรียกใช้ในหน้าต่างพรอมต์ CMD

นี่คือคำสั่ง:

"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว แต่ไม่ประสบความสำเร็จ (ฉันได้ลองทำซ้ำหลายครั้งเพื่อลองให้ได้สิ่งที่ใช้งานได้ไวยากรณ์น่าจะหมด):

$TEXT = $textbox.Text #$textbox is where the user enters the PC name.
$CMDCOMMAND = "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"
Start-Process '"$CMDCOMMAND" $TEXT'
#iex -Command ('"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"' $TEXT)

คำสั่งจะเปิดหน้าต่างการเชื่อมต่อระยะไกล SCCM ไปยังคอมพิวเตอร์ที่ผู้ใช้ระบุในกล่องข้อความ


ฉันไม่แน่ใจว่าคุณใช้ SCCM เวอร์ชันใด แต่ 07 ต้องใช้ "-1" แต่ปี 2012 ไม่ใช้เมื่อเปิด CmRcViewer เพียงแค่ FYI
Kevin_

คำตอบ:


102

ลองสิ่งนี้:

& "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

ใน PowerShell สตริง "... " เป็นเพียงสตริงและ PowerShell จะประเมินโดยการสะท้อนไปที่หน้าจอ ที่จะได้รับ PowerShell &เพื่อดำเนินการคำสั่งที่มีชื่ออยู่ในสตริงคุณใช้ประกอบการโทร


ยอดเยี่ยมนี้ได้ผล ควรใช้กับคำสั่ง cmd ส่วนใหญ่หรือไม่
user3585839

4
ใช่ แต่ไม่จำเป็นสำหรับ exes ที่ไม่มีช่องว่างในชื่อหรือเส้นทาง ตัวอย่างเช่นคุณสามารถดำเนินการได้โดยไม่ต้องใช้ipconfig.exe &เวลาเดียวที่คุณต้องใช้&คือการเรียกชื่อคำสั่งในรูปแบบสตริง และคุณต้องใช้ "string form" เมื่อมีช่องว่างในเส้นทางหรือชื่อไฟล์
Keith Hill

17
ฉันจะเพิ่มว่ามันใช้ไม่ได้ในการสร้างสตริงบรรทัดคำสั่งและพยายามดำเนินการด้วย&เพราะ PowerShell จะคิดว่าสตริงทั้งหมดเป็นชื่อของไฟล์ปฏิบัติการ แทนที่จะอ้างเฉพาะชื่อของไฟล์ปฏิบัติการและใส่พารามิเตอร์ของไฟล์ปฏิบัติการในภายหลัง
Bill_Stewart

อะไรคือความแตกต่างระหว่าง&และcmd?
Timo

1
&คือตัวดำเนินการเรียก PowerShell (aka invocation) ช่วยให้คุณดำเนินการคำสั่งเมื่อสิ่งที่คุณมีเป็นสตริงที่มีชื่อของคำสั่งหรือพา ธ ไปยัง exe นอกจากนี้คุณยังสามารถระบุเช่น scriptblock หรือเช่น &{$foo=42} Commandino วัตถุ เป็นเปลือกที่แตกต่างกัน โปรดทราบว่าดำเนินการในขอบเขตลูกดังนั้นคุณจะทราบว่าหลังจากบล็อกสคริปต์ที่ตั้งค่าด้านบนเสร็จสิ้นแล้วจะไม่มีการตั้งค่าอีกต่อไป $cmd = Get-Command Get-Date; &$cmdcmd&$foo$foo
Keith Hill

56

ในการเรียกใช้หรือแปลงไฟล์แบตช์จากภายนอกจาก PowerShell (โดยเฉพาะอย่างยิ่งหากคุณต้องการลงนามสคริปต์งานที่กำหนดเวลาไว้ทั้งหมดด้วยใบรับรอง) ฉันเพียงแค่สร้างสคริปต์ PowerShell เช่น deleteefolders.ps1

ป้อนข้อมูลต่อไปนี้ลงในสคริปต์:

cmd.exe /c "rd /s /q C:\#TEMP\test1"

cmd.exe /c "rd /s /q C:\#TEMP\test2"

cmd.exe /c "rd /s /q C:\#TEMP\test3"

* แต่ละคำสั่งจะต้องใส่บรรทัดใหม่ที่เรียก cmd.exe อีกครั้ง

สคริปต์นี้ขณะนี้คุณสามารถลงนามและเรียกใช้จาก PowerShell outputting คำสั่งพร้อมรับคำสั่ง / cmdโดยตรง

เป็นวิธีที่ปลอดภัยกว่าการรันไฟล์แบตช์มาก!


สิ่งนี้ได้ผลดีสำหรับฉัน ฉันพยายามเรียกใช้: sc query serviceNameจาก PowerShell คิดว่าจะดำเนินการ แต่ไม่มีผลลัพธ์ ฉันลองใช้เทคนิค & ซ้ำหลายครั้งไม่ต้องใช้ลูกเต๋า แต่ใช้งานตามวิธีที่คุณแนะนำ ต่อไปฉันกด cmd.exe /? เพื่อดูว่ามีสิ่งมหัศจรรย์อื่นใดรอฉันอยู่ ฉันชอบเรียกใช้ cmd เมื่อจำเป็นเท่านั้น
Paul Masek

9

ทางออกหนึ่งคือการไปป์คำสั่งของคุณจาก PowerShell ไปยัง CMD การรันคำสั่งต่อไปนี้จะไพพ์notepad.exeคำสั่งไปที่ CMD ซึ่งจะเปิดแอปพลิเคชัน Notepad

PS C:\> "notepad.exe" | cmd

เมื่อคำสั่งทำงานใน CMD คุณจะกลับไปที่พรอมต์ PowerShell และสามารถเรียกใช้สคริปต์ PowerShell ของคุณต่อไปได้


การแก้ไข

ข้อความเริ่มต้นของ CMD จะแสดงขึ้น

ตามที่mklement0ชี้ให้เห็นวิธีนี้จะแสดงข้อความเริ่มต้นของ CMD หากคุณต้องการคัดลอกผลลัพธ์โดยใช้วิธีการด้านบนไปยังเทอร์มินัลอื่นข้อความเริ่มต้นจะถูกคัดลอกไปด้วย


สามารถทำงานได้แม้ว่า&จะไม่ เช่น& "mklink"ไม่ได้ทำงานให้ฉันในขณะที่"mklink" | cmdทำงาน
moudrick

2

สำหรับผู้ที่อาจต้องการข้อมูลนี้:

ฉันคิดว่าคุณสามารถเรียกใช้คำสั่งที่อยู่ในPATHสคริปต์ PS ของคุณได้ค่อนข้างมากและควรใช้งานได้

บางครั้งคุณอาจต้องเปิดคำสั่งนี้ล่วงหน้าด้วย cmd.exe /c

ตัวอย่าง

เรียกคอมไพล์จากสคริปต์ PS

ฉันต้องบรรจุgitไคลเอนต์ใหม่ที่ห่อด้วยChocolatey(สำหรับผู้ที่ไม่ทราบว่าเป็นแอพสโตร์สำหรับ Windows) ซึ่งใช้สคริปต์ PS เป็นจำนวนมาก

ฉันพบว่าเมื่อgitอยู่ในPATHคำสั่งเช่น

$ca_bundle = git config --get http.sslCAInfo

จะจัดเก็บตำแหน่งของgit crtไฟล์ใน$ca_bundleตัวแปร

กำลังมองหาแอป

อีกตัวอย่างหนึ่งที่รวมกันของโพสต์ SO ปัจจุบันและโพสต์ SO นี้คือการใช้whereคำสั่ง

$java_exe = cmd.exe /c where java

จะจัดเก็บตำแหน่งของjava.exeไฟล์ใน$java_exeตัวแปร


1
คุณจำเป็นต้องcmd /cเรียกใช้คำสั่งภายในเท่านั้นเช่นmklink. ในทางตรงกันข้ามwhere.exeเป็นโปรแกรมภายนอกดังนั้นคุณสามารถเรียกใช้โดยตรง อย่างไรก็ตามเนื่องจากชื่อขัดแย้งกับwhereนามแฝงในตัวของ PowerShell (สำหรับWhere-Object) คุณจึงต้องใช้where.exe; เช่นwhere.exe java.
mklement0

หรือใช้ PowerShell Get-Commandแทนการโทรcmd? เหมือนเดิม:$java_exe = $(Get-Command java.exe).Source
dtasev

-1

คุณต้องใช้ Invoke-Command cmdlet เพื่อเปิดโปรแกรมภายนอกนี้ โดยปกติจะทำงานโดยไม่ต้องใช้ความพยายาม

หากคุณต้องการมากกว่าหนึ่งคำสั่งคุณควรใช้ Invoke-Expression cmdlet กับ-scriptblockอ็อพชัน


1
ไม่จำเป็นต้องเรียกใช้คำสั่งในกรณีนี้ (ดูคำตอบของ Keith Hill)
Bill_Stewart

ใช่ฉันเห็นด้วยกับสิ่งนั้น ฉันคิดมากเกี่ยวกับโซลูชันการเขียนสคริปต์
Tim Christin

4
ไม่สำคัญว่าคำสั่งจะถูกเรียกใช้จากสคริปต์หรือไม่ ยังไม่จำเป็นต้องใช้ Invoke-Command ในกรณีนี้
Bill_Stewart


โปรดอย่าให้ "คำตอบ" โดยไม่มีตัวอย่าง
AX
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.