Echo เทียบเท่าใน PowerShell สำหรับการทดสอบสคริปต์


233

ฉันต้องการส่งออกตัวแปรและค่าในสคริปต์PowerShellโดยการตั้งค่าสถานะและดูข้อมูลการบวชตลอดทั้งสคริปต์

ฉันจะทำสิ่งนี้ได้อย่างไร

ตัวอย่างเช่น PowerShell จะเทียบเท่ากับโค้ด PHP ต่อไปนี้คืออะไร

echo "filesizecounter: " . $filesizecounter 

ตรวจสอบสคริปต์บรรณาธิการ / ดีบักที่มาพร้อมกับPowerGUI อาจเหมาะกับสิ่งที่คุณกำลังทำ ฉันเข้าใจว่า Powershell 2 มาพร้อมกับดีบักเกอร์ด้วย (แต่ฉันไม่ได้ลองเลย)
dan-gph

คำตอบ:


275

มีหลายวิธี:

Write-Host: เขียนโดยตรงไปยังคอนโซลไม่รวมอยู่ในฟังก์ชั่น / เอาต์พุต cmdlet อนุญาตให้ตั้งค่าสีพื้นหน้าและพื้นหลัง

Write-Debug: เขียนโดยตรงไปยังคอนโซลหาก$DebugPreferenceตั้งค่าเป็นดำเนินการต่อหรือหยุด

Write-Verbose: เขียนโดยตรงไปยังคอนโซลหาก$VerbosePreferenceตั้งค่าเป็นดำเนินการต่อหรือหยุด

หลังมีไว้สำหรับข้อมูลเพิ่มเติมที่เป็นทางเลือกWrite-Debugสำหรับการดีบั๊ก

เพิ่มเติม : ในสคริปต์ PSH2 (อย่างน้อย) การใช้ cmdlet binding จะได้รับ-Verboseและ-Debugเปลี่ยนพารามิเตอร์โดยอัตโนมัติการเปิดใช้งานแบบโลคัลWrite-VerboseและWrite-Debug(เช่นการแทนที่ตัวแปรการกำหนดค่าตามความชอบ) เช่นเดียวกับ cmdlet ที่รวบรวมและตัวให้บริการทำ


4
สิ่งที่ดีเกี่ยวกับ Write-Debug และ Write-Verbose คือคุณสามารถฝากข้อความ debug ไว้ในโค้ดของคุณและเพียงแค่เปิดเอาต์พุตเมื่อคุณต้องการโดยใช้ตัวแปรการตั้งค่าที่เหมาะสม ประหยัดเวลาและเป็นคุณสมบัติที่ดีสำหรับผู้ใช้งานฟังก์ชั่นอื่น ๆ ของคุณ
JasonMArcher

5
คุณต้องการทำความคุ้นเคยกับ Out-String เนื่องจากมีวัตถุที่ไม่สำคัญคุณจะต้องใช้สิ่งนั้นเพื่อแปลงวัตถุเป็นสตริงที่สามารถแสดงผลได้ก่อนที่จะใช้ Write- * cmdlet สามตัวใด ๆ เหล่านี้
Jaykul

113

Powershell มีนามแฝงการแมป echo ไปที่Write-Output:

echo "filesizecounter : $filesizecounter"


7
echoเป็นชื่อแทนWrite-OutputตามTechNetของ Microsoft และกล่าวถึงที่นี่
Glenn Lawrence

2
ขอบคุณ Glenn ดูเหมือนว่านามแฝงจะถูกแมปใหม่ใน 6 ปีนับตั้งแต่ฉันโพสต์สิ่งนี้ สิ่งไหนดีใครไม่ควรใช้ Write-Host เพราะมันข้ามไปป์ไลน์ ฉันได้อัปเดตคำตอบเพื่อระบุสิ่งนี้ ขอบคุณ!
Justin R.

3
ทำไมคุณไม่ต้องการข้ามขั้นตอนการทำงานหากสิ่งที่คุณต้องการทั้งหมดคือ echo "debug" ไปยังคอนโซลเพื่อติดตามการทำงานของสคริปต์? Write-Output มีผลข้างเคียงที่แปลกประหลาดซึ่งเนื้อหาของการเรียกไปที่ Write-Output ครั้งสุดท้ายจะถูกทิ้งไว้บนสแต็กโดยแทนที่ตัวแปรใด ๆ ที่คุณพยายามที่จะกลับมาจากฟังก์ชั่นอย่างชัดเจน ผลข้างเคียงเช่นนั้นให้ความรู้สึกเหมือนภาษาที่มีพฤติกรรมรุนแรง
Craig

33

PowerShell สอดแทรกใช่ไหม?

ใน PHP

echo "filesizecounter: " . $filesizecounter 

สามารถเขียนเป็น:

echo "filesizecounter: $filesizecounter" 

ใน PowerShell บางสิ่งเช่นนี้ควรเหมาะกับความต้องการของคุณ:

Write-Host "filesizecounter: $filesizecounter"

9
PHP ไม่มีส่วนเกี่ยวข้องกับคำถามนี้
reggaeguitar


14

โดยวิธีที่ง่ายที่สุดในการ echo ใน powershell เพียงแค่สร้างวัตถุสตริงและปล่อยให้มันไปป์ไลน์:

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

แน่นอนว่าคุณต้องยอมแพ้เมื่อไม่ได้ใช้เมธอด Write- *


9

ก้องเป็นนามแฝงที่จะเขียนเอาท์พุทแม้ว่ามันจะมีลักษณะเช่นเดียวกับการเขียนโฮสต์

มันไม่ใช่ความแตกต่างระหว่าง echo และ Write-Host ใน PowerShell คืออะไร? .

echo เป็นนามแฝงสำหรับ Write-Output ซึ่งเขียนไปยังสตรีมเอาต์พุตความสำเร็จ สิ่งนี้อนุญาตให้ประมวลผลเอาต์พุตผ่านไพพ์ไลน์หรือเปลี่ยนเส้นทางไปยังไฟล์ เขียนโฮสต์เขียนโดยตรงไปยังคอนโซลดังนั้นเอาต์พุตไม่สามารถเปลี่ยนเส้นทาง / ประมวลผลเพิ่มเติมได้



5

ฉันไม่รู้ว่าควรทำเช่นนั้นหรือไม่ แต่คุณสามารถเขียนได้

"filesizecounter: " + $filesizecounter

และมันควรจะออก:

filesizecounter: ค่า


1
"filesizecounter: $filesizecounter"สั้นกว่า
jiggunjer

3

PowerShell echoมีนามแฝงสำหรับคำสั่งทั่วไปหลายประการเช่น พิมพ์ต่อไปนี้ใน PowerShell:

Get-Alias echo

เพื่อรับการตอบกลับ:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           echo -> Write-Output

แม้จะได้รับการบริการ Alias gal -> Get-Aliasมีนามแฝง คุณสามารถเขียนgal echoเพื่อรับนามแฝงechoได้

gal echo

นามแฝงอื่น ๆ มีการระบุไว้ที่นี่: https://docs.microsoft.com/en-us/powershell/scripting/learn/using-familiar-command-names?view=powershell-6

cat dir mount rm cd echo move rmdir chdir erase popd sleep clear h ps sort cls history pushd tee copy kill pwd type del lp r write diff ls ren


2

ลองGet-Content .\yourScript.PS1แล้วคุณจะเห็นเนื้อหาของสคริปต์ของคุณ

นอกจากนี้คุณสามารถแทรกบรรทัดนี้ในโค้ดของคุณ:

get-content .\scriptname.PS1
script code
script code

....


ไม่แสดงค่าจริงที่ประมวลผล (เช่นการทดแทน env var) ดังนั้นจึงไม่ใช่คำตอบสำหรับคำถามที่ถาม
iisystems

0

มันควรจะกล่าวถึงด้วยว่าSet-PSDebugนั้นคล้ายกับecho onชุดคำสั่งแบบเก่า:

Set-PSDebug -Trace 1

คำสั่งนี้จะส่งผลให้แสดงทุกบรรทัดของสคริปต์การดำเนินการ:

เมื่อTraceพารามิเตอร์มีค่า 1 แต่ละบรรทัดของสคริปต์จะถูกติดตามขณะที่รัน เมื่อพารามิเตอร์มีค่า 2 การกำหนดตัวแปรการเรียกใช้ฟังก์ชันและการเรียกใช้สคริปต์จะถูกติดตามด้วย หากระบุพารามิเตอร์ Step คุณจะได้รับพร้อมท์ก่อนที่สคริปต์แต่ละบรรทัดจะทำงาน

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