รับเอาต์พุตของคำสั่ง CMD และตั้งค่าเป็นตัวแปรแบตช์


6

ฉันรันคำสั่งนี้เพื่อรับชื่อกลุ่ม:

set "remotegroup="
     for /f "skip=1delims=" %%a in (
     '"wmic group where sid="S-1-5-32-555" get name"'
     ) do if not defined remotegroup set "remotegroup=%%a"

แต่เมื่อฉันทำสิ่งนี้ echo "%rdpgroup%"ผลลัพธ์จะเป็นดังนี้:

"Remote Desktop Users  "

ฉันไม่ต้องการช่องว่างเหล่านี้ในตอนท้ายของผู้ใช้ แค่ต้องการผลลัพธ์เช่นนี้"Remote Desktop Users"


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

@IronWilliamCash สิ่งที่ฉันต้องการลบช่องว่างเหล่านั้น ฉันไม่รู้เหมือนกัน
Aria Fathi

คุณสามารถลบช่องว่างที่ไม่พึงประสงค์ด้วยคำสั่งในรูปแบบนี้เพียงเพิ่มไปยังส่วนที่เหมาะสมของสคริปต์: set "rdpgroup =! rdpgroup: =!" (เพียงแปลงสองช่องว่างเป็นช่องว่างเดียว แต่คุณสามารถเปลี่ยนเป็นตัวอย่างเช่นแปลง 4 ช่องว่างเป็นช่องว่างเดียวหรือเพื่อแปลง 3 ช่องว่างเป็นไม่มีช่องว่าง - มีความเป็นไปได้มากมาย)
Ed999

คำตอบ:


7

ผลผลิตของ WMIC เป็น unicode!

การลากต่อท้าย<CR>สามารถลบออกได้โดยส่งผ่านค่าผ่านทาง FOR / F ลูปอื่น สิ่งนี้ยังลบบรรทัด "ว่างเปล่า" ของ phantom (อันที่จริงแล้ว<CR>)

@echo off
set "remotegroup="
for /f "skip=1 delims=" %%a in ('"wmic group where sid="S-1-5-32-555" get name"') do (
    for /f "delims=" %%b in ("%%a") do if not defined remotegroup set "remotegroup=%%~nb"
)
echo "%remotegroup%"
pause

0

วิธีต่างๆในการรับผลลัพธ์เดียวกันโดย ThunderJun:

OP1: ที่นี่เราใช้ setlocal เพื่อเปิดใช้งานการใช้ตัวแปรพิเศษของชนิดที่ล่าช้า (! var!) โดยไม่ต้องใช้ a สำหรับอีกตัวสำหรับ เพื่อให้ได้ผลลัพธ์เดียวกัน

OP2: ที่นี่เรากำหนดคำสั่งในตัวแปรชนิดทั่วไปและด้วยความช่วยเหลือของแถบแนวตั้งเรารวมหลายคำสั่งโดยให้ความสำคัญเป็นอันดับแรกเสมอ เราเพิ่มตัวกรอง: อีก +1 เพื่อระบุว่าไม่สนใจบรรทัดเอาต์พุตแรกจากนั้นเพิ่มตัวกรอง: findstr / i "remot" ที่มีแถบแนวตั้งอีกแถบหนึ่งซึ่งเราระบุไว้ว่ามีเพียงพิมพ์บรรทัดที่มีคำหลักที่อยู่ใน คำพูดและที่ไม่แยกความแตกต่างระหว่างตัวอักษรตัวพิมพ์ใหญ่หรือเล็ก จากนั้นเราใช้ตัวแปรชนิดทั่วไปที่บ่งบอกถึงมันเพื่อไม่แสดงอักขระ 3 ตัวสุดท้าย:% var: ~ 0, -3% ด้วยวิธีนี้เราจะได้รับผลลัพธ์เดียวกันโดยไม่ใช้ a สำหรับอีกตัว

OP3: ที่นี่เราใช้ setlocal เพื่อเปิดใช้งานการใช้ตัวแปรพิเศษประเภทล่าช้า (! var!) ด้วยแถบแนวตั้งที่ส่วนท้ายของคำสั่งด้านในสำหรับ สำหรับมันเรากำหนดตัวกรองด้วยคำสั่ง: findstr / i "remot" เพื่อระบุว่าจะพิมพ์เฉพาะบรรทัดที่มีคำสำคัญในเครื่องหมายคำพูดและไม่แยกความแตกต่างระหว่างตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก เราใช้ตัวแปรพิเศษของชนิดที่ล่าช้าในการจับเอาท์พุทคำสั่งและเราระบุแทนที่ 2 ตัวอักษรของช่องว่างเพื่ออะไร (! var: =!) เพื่อให้ได้ผลลัพธ์เดียวกันโดยไม่ต้องใช้สำหรับภายในจากที่อื่น

@echo off

:::::::::::::OP1 START. BY ThunderJun
setlocal enabledelayedexpansion
set remotegroup=
for /f "skip=1 delims=" %%a in ('"wmic group where sid="S-1-5-32-555" get name"') do (
set remotegroup=%%a!remotegroup:~0,-4!
set rio=!remotegroup:~0,-1!
set remotegroup=!rio:~0,-1!
)
echo  OP1 "%remotegroup%"
:::::::::::::OP1 END

:::::::::::::OP2 START. BY ThunderJun
set a='"wmic group where sid="S-1-5-32-555" get name |more +1 |findstr /i "remot""'
for /f "delims=" %%c in (%a%) do (set remotegroup=%%c)
echo  OP2 "%remotegroup:~0,-3%"
:::::::::::::OP2 END

:::::::::::::OP3 START. BY ThunderJun
setlocal enabledelayedexpansion
set remotegroup=
for /f "delims=" %%a in ('"wmic group where sid="S-1-5-32-555" get name |findstr "remot""') do (
    set remotegroup=%%~na& set remotegroup=!remotegroup:  =!)
echo  OP3 "%remotegroup%"
:::::::::::::OP4 END


pause

หากคุณเพียงแค่อ้างคำตอบของ Hackooกรุณาอย่าทำเช่นนั้น หากคุณกำลังนำเสนอรุ่นที่ปรับปรุงแล้วโปรดชี้ให้เห็นสิ่งที่คุณเปลี่ยนแปลง
สกอตต์

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