2013-04-10 30 views
6

Điều gì đó thực sự lạ với ngôn ngữ này. Tôi đang cố gắng thực thi một hàm và sử dụng giá trị kết quả của nó làm điều kiện. Đây là mã của tôi:Điều kiện với một cuộc gọi hàm trong PowerShell

function Get-Platform() 
{ 
    # Determine current Windows architecture (32/64 bit) 
    if ([System.Environment]::GetEnvironmentVariable("ProgramFiles(x86)") -ne $null) 
    { 
     echo "x64" 
     return "x64" 
    } 
    else 
    { 
     echo "x86" 
     return "x86" 
    } 
} 

if (Get-Platform -eq "x64") 
{ 
    echo "64 bit platform" 
} 
if (Get-Platform -eq "x86") 
{ 
    echo "32 bit platform" 
} 

Sản lượng dự kiến ​​là thế này:

x64 
64 bit platform 

Nhưng sản lượng thực tế là thế này:

64 bit platform 
32 bit platform 

gì đang xảy ra ở đây? Làm thế nào để sửa cái này? Tôi không thể tìm thấy bất kỳ ví dụ nào trên web sử dụng các chức năng bên trong điều kiện if. Điều đó có thể xảy ra ở Powershell không? Tôi đang ở trên Windows 7 không có thiết lập đặc biệt, vì vậy tôi có bất kỳ phiên bản PS đi kèm với nó.

Trả lời

16

Nếu bạn muốn so sánh giá trị trả về của một hàm trong một điều kiện, bạn phải nhóm gọi hàm (tức là đặt nó trong dấu ngoặc đơn) hoặc (như @FlorianGerhardt được đề xuất) gán giá trị trả về của hàm cho một biến và sử dụng biến đó trong điều kiện. Nếu không, toán tử so sánh và toán hạng khác sẽ được chuyển làm đối số cho hàm (trong trường hợp của bạn, chúng bị loại bỏ âm thầm). Hàm của bạn sau đó trả lại kết quả không phải là "" cũng không phải 0 cũng không $null, vì vậy, nó sẽ đánh giá thành $true, khiến cả hai thông báo được hiển thị.

này nên làm những gì bạn muốn:

... 
if ((Get-Platform) -eq 'x64') { 
    echo "64 bit platform" 
} 
... 

BTW, bạn nên tránh sử dụng if báo cáo riêng biệt cho điều kiện loại trừ lẫn nhau. Đối với một nền tảng kiểm tra một if..then..elseif

$platform = Get-Platform 
if ($platform -eq "x64") { 
    ... 
} elseif ($platform -eq "x86") { 
    ... 
} 

hoặc một switch tuyên bố

Switch (Get-Platform) { 
    "x86" { ... } 
    "x64" { ... } 
} 

sẽ thích hợp hơn.

Tôi cũng sẽ tránh lặp lại bên trong hàm. Chỉ cần trả về giá trị và thực hiện bất kỳ việc lặp lại nào có thể được yêu cầu với giá trị trả lại. Bất cứ điều gì lặp lại bên trong hàm cũng sẽ được trả lại cho người gọi.

Lưu ý cuối cùng: cá nhân tôi không muốn dựa vào sự tồn tại của một biến thư mục hoặc môi trường cụ thể để xác định kiến ​​trúc hệ điều hành. Sử dụng WMI cho nhiệm vụ này cho là tôi rất nhiều đáng tin cậy hơn:

function Get-Platform { 
    return (gwmi Win32_OperatingSystem).OSArchitecture 
} 

Chức năng này sẽ trả về một chuỗi "32-Bit" hoặc "64-Bit", tùy thuộc vào kiến ​​trúc hệ điều hành.

+0

Cảm ơn bạn đã giải thích đầy đủ. Sử dụng dấu ngoặc đơn xung quanh tên hàm thực sự có vẻ như gọi hàm, do đó, điều này có vẻ giống như một giải pháp phổ quát cho các vấn đề như vậy. Đơn giản hơn nhiều so với sử dụng tên biến khác cho nó. Tiếng vọng trong hàm (được thay thế bằng Máy chủ ghi để hoạt động) chỉ dành cho mục đích truy tìm. Đây là một kịch bản testcase. Mặc dù bây giờ tôi thấy kết quả sau: "x64", "nền tảng 64 bit", "x64". Cuộc gọi WMI dường như trả về một chuỗi được bản địa hóa, với tôi đó là "64-bit". Kiểm tra khác được sử dụng rộng rãi ở những nơi khác. – ygoe

+0

'OSArchitecture' trả về một chuỗi' "32-Bit" 'hoặc' "64-Bit" ', tùy thuộc vào kiến ​​trúc hệ điều hành, vì vậy bạn phải điều chỉnh các điều kiện cho điều đó. –

3

Tôi nghĩ bạn đang so sánh một hàm và không phải là kết quả hàm. Cũng bằng cách nào đó, tiếng vọng không hoạt động như mong đợi trong một hàm. Tôi thường sử dụng Write-Host.

Đây là giải pháp của tôi cho vấn đề của bạn:

function Get-Platform() 
{ 
    # Determine current Windows architecture (32/64 bit) 
    if ([System.Environment]::GetEnvironmentVariable("ProgramFiles(x86)") -ne $null) 
    { 
     Write-Host("x64") 
     return "x64" 
    } 
    else 
    { 
     Write-Host("x86") 
     return "x86" 
    } 
} 

$platform = Get-Platform 

if ($platform -eq 'x64') 
{ 
    echo "64 bit platform" 
} 

if ($platform -eq 'x86') 
{ 
    echo "32 bit platform" 
} 
Các vấn đề liên quan