การดำเนินการคำสั่งที่เก็บไว้ในตัวแปรจาก PowerShell


152

ฉันมีคำสั่งที่ฉันได้สร้างและเก็บไว้ในตัวแปรใน PowerShell คำสั่งนี้ใช้งานได้หากฉันเขียนโฮสต์และคัดลอกและวางลงในcmd.exeหน้าต่างมาตรฐาน

ฉันจะรันคำสั่งนี้จากภายในสคริปต์ของฉันได้อย่างไร

ฉันได้ลองใช้ชุดคำสั่ง Invoke-Command หรือ Invoke-Expression หลายแบบโดยไม่มีโชค

นี่คือวิธีที่ฉันสร้างตัวแปร:

$cmd1 = $arcprg + $arcdir + "\" + $site1 + "-" + $hst + "-" + $yesterday + ".zip " + $logpath1 + "u_ex" + $yesterday + ".log"

นี่คือสิ่งที่ตัวแปรดูเหมือนว่าถูกพิมพ์ลงบนหน้าจอ:

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log

คำตอบ:


207

นี่เป็นอีกวิธีหนึ่งที่ไม่มีInvoke-Expressionแต่มีสองตัวแปร (คำสั่ง: สตริงและพารามิเตอร์: อาร์เรย์) มันใช้งานได้ดีสำหรับฉัน สมมติว่า 7z.exeอยู่ในเส้นทางของระบบ

$cmd = '7z.exe'
$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& $cmd $prm

หากคำสั่งเป็นที่รู้จัก (7z.exe) และพารามิเตอร์เท่านั้นที่เป็นตัวแปรแล้วจะทำ

$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& 7z.exe $prm

BTW โดยInvoke-Expressionมีพารามิเตอร์ตัวเดียวทำงานให้ฉันเช่นกันงานนี้

$cmd = '& 7z.exe a -tzip "c:\temp\with space\test2.zip" "C:\TEMP\with space\changelog"'

Invoke-Expression $cmd

ป.ล. Invoke-Expressionผมมักจะชอบวิธีการที่มีอาร์เรย์พารามิเตอร์เพราะมันง่ายในการเขียนโปรแกรมมากกว่าที่จะสร้างการแสดงออกสำหรับ


เป็นสิ่งที่ดี. ตอนนี้มันเริ่มมารวมกันแล้ว แทนที่จะเป็น 'c: \ temp \ with space \ test1.zip' ฉันสามารถใช้ตัวแปร $ ได้หรือไม่ ฉันจำเป็นต้องวางไว้ที่ "" หรือ "" หรือไม่?
เทรวิส

การ Splatting ดูเหมือนจะใช้งานได้เหมือนกัน: & $ cmd @prm แต่ฉันอยากรู้ว่าทำไมถึงเป็นเช่นนั้น
C2H5OH

44

ลองเรียกใช้คำสั่งของคุณด้วยInvoke-Expression:

Invoke-Expression $cmd1

นี่คือตัวอย่างการทำงานบนเครื่องของฉัน:

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt"
Invoke-Expression $cmd

iexเป็นนามแฝงเพื่อInvoke-Expressionให้คุณสามารถทำได้:

iex $cmd1

สำหรับรายชื่อเต็ม: เยี่ยมชมhttps://ss64.com/ps/มากPowershellสิ่ง

โชคดี...


บอกฉันคำว่า '7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log' ไม่ได้รับการยอมรับว่าเป็นชื่อของ cmdlet, ฟังก์ชั่น, ไฟล์สคริปต์หรือโปรแกรมที่ทำงานได้ ตรวจสอบการสะกดชื่อหรือถ้ารวมพา ธ ตรวจสอบว่าพา ธ นั้นถูกต้องแล้วลองอีกครั้ง ที่: บรรทัด: 14 ถ่าน: 1 + & <<<< $ cmd1
เทรวิส

@ Travis: โอ๊ะโอ เครื่องหมายแอมเปอร์แซนด์ใช้งานได้หากไม่มี args ฉันอัปเดตโพสต์ด้วยโซลูชันสำหรับคำสั่งของคุณ
kbrimington

ฉันลองเรียกใช้นิพจน์ก่อนหน้านี้แล้วและมันไม่ทำงาน มันคายข้อผิดพลาด: ค่าคงที่ตัวเลขไม่ดี: 7. ที่: บรรทัด: 1 ถ่าน: 2 + 7z <<<< .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ log \ logfiles \ w3svc1 \ u_ex100827.log มันเกือบจะดูเหมือนว่ามันกำลังพยายามประเมินมันแทนการรันมัน
เทรวิส

@Travis: อาจเป็นได้ว่า 7z.exe ไม่ได้อยู่ในเส้นทางของคุณ ตรวจสอบว่ามันอยู่ในเส้นทางและ / หรือลองตั้งชื่อพา ธ แบบเต็มให้กับไฟล์ที่เรียกใช้งานได้ในนิพจน์ของคุณ
kbrimington

1
@ Travis: ฉันเพิ่งยืนยันในระบบของตัวเองว่า 7z.exe ให้ข้อผิดพลาดที่คุณอธิบายเพียงพิมพ์จาก command prompt แต่ด้วยพา ธ เต็มไปที่ 7z.exe (สำหรับฉันมันเป็น'C:\Program Files\7-zip\7z.exe'ฉันสามารถรัน 7z.exe ได้
kbrimington
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.