簡體   English   中英

Azure Powershell Output 未顯示在控制台中

[英]Azure Powershell Output not displayed in the console

我在 Azure PowerShell 中創建了一個腳本。

如果我使用“echo”命令,它會在控制台上顯示 output。

但是,如果我使用 Write-Output 和 Write-Error,我看不到 output。

我已將腳本“change-to-static.ps1”上傳到存儲帳戶。 然后我用頂部欄中的按鈕打開“Cloud Shell”。 然后我在 PowerShell 控制台中輸入“./change-ip-to-static.ps1”。

因此,腳本不會產生任何 output 除非我將“Write-Output”和“Write-Error”替換為“echo”或“print”。

請幫我。 怎么看output?

腳本如下。

How to output something in PowerShell 中有一個類似的問題。 我已經閱讀了它,但是沒有關於如何實現我的目標的具體示例,即如何修改我的腳本以查看 output。 在我的情況下,即使我重定向到文本文件,它也不會 output 。 但是,在我的案例中,像“echo”和“print”這樣的命令可以工作,但上面的示例沒有涵蓋它們。 請參閱下面的腳本。

$IPs = Get-AzPublicIpAddress; 
$Static = "Static";
foreach ($PublicIP in $IPs) {
    $Method = $PublicIP.PublicIpAllocationMethod;
    $Name = $PublicIP.Name;
    if ($Method -eq $Static) {
        $message = "The method of " + $Name + " is already " + $Static;
        Write-Progress -Activity $message;
    }
    else {
        Write-Progress -Activity "Changing the method of "+$Name+" from "+$Method+" to "+$Static+"...";
        $PublicIP.PublicIpAllocationMethod = $Static;
        Set-AzPublicIpAddress -PublicIpAddress $PublicIP;
        Write-Progress -Activity "Querying the method of "+$Name+"...";
        $ModifiedAddress = Get-AzPublicIpAddress -Name $Name -ResourceGroupName $PublicIP.ResourceGroupName -Location $PublicIP.Location
        $NewMethod = $ModifiedAddress.PublicIpAllocationMethod;
        if ($NewMethod -eq $Static) {
            Write-Output "The method for "+$Name+" has successfully changed to "+$Static;
        }
        else {
            Write-Error -Message "Cannot change the method for "+$Name+" to "+$Static+", it is still "+$NewMethod+"!!!";
        }
    }
}

PS我已經根據建議更新了腳本(使用這個URL) ,但仍然沒有output。 只有“回聲”或“打印”給出 output。 PPS Write-ProgressSet-AzPublicIpAddress期間甚至不會在狀態行中顯示臨時消息,這需要幾秒鍾才能完成,或者如果我添加了Start-Sleep cmdlet。 它僅在Get-AzPublicIpAddress期間設置。

在閱讀了您對我的答案的最后編輯后,我相信您在使用Write-*命令行開關和腳本邏輯時有些困惑,因此我提供了一個更詳細的帶有上下文的答案。

Powershell Azure Cloud Shell 中的echoWrite-Output的別名,因為在沒有參數的情況下執行echo清楚地顯示( 此處的文檔)。

PS /home/mikelangelo> echo

cmdlet Write-Output at command pipeline position 1
Supply values for the following parameters:
InputObject:

此外:unix echo也可以在 Powershell Azure Cloud ZEA89B68C34CE4A633C0FZ7E174 中運行

PS /home/mikelangelo> which echo
/usr/bin/echo 
PS /home/mikelangelo> /usr/bin/echo ciao mondo
ciao mondo

另一方面, print不是 Powershell 別名,因此 unix 對應項是在使用print關鍵字時始終執行的那個(目前是run-mailcap的符號鏈接 - 但我不清楚它是如何發揮作用的你的用例。)

PS /home/mikelangelo> which print
/usr/bin/print

因此,基本上, echoWrite-Output都可以工作,因為它們調用相同的命令行開關,除非您直接執行/usr/bin/echo ,否則會混淆技術並有效地損害可移植性。

回到問題: Write-Output按預期工作。 邏輯錯誤:您使用=作為比較運算符,但您需要使用-eq代替。

Write-Progress需要以不同的方式使用,將其替換為Write-HostWrite-Output 有關說明,請參閱文檔

請注意, Write-Output將 object 發送到管道中,最終可以表示為控制台 output。 另一方面, Write-ProgressWrite-Host不會生成 output - 后者將 object 發送到主機進行顯示,因此Write-Host是在控制台中顯示內容的推薦方式。 有關Write-HostWrite-Output和 Powershell 管道的更多詳細信息,請參閱此問題

像我之前的其他評論者一樣,我也可以確認您的要點中的代碼在 Azure Cloud Shell 中運行良好。

我注意到只有一個 output 如果您至少有一個動態公共 ip 腳本可以更改為 static。 原因是,只有在這種情況下,您才使用Write-Output將字符串返回到控制台。

如果沒有動態公共 ip 離開,你的腳本只寫一個進度消息,但你永遠看不到它,因為在你寫完消息后腳本執行結束得太快,進度消息不會逗留。

將命令Start-Sleep -Seconds 2放在帶有Write-Progress的行下,您將明白我的意思:

$IPs = Get-AzPublicIpAddress;
$Static = "Static";
foreach ($PublicIP in $IPs) {
    $Method = $PublicIP.PublicIpAllocationMethod;
    $Name = $PublicIP.Name;
    if ($Method -eq $Static) {
        $message = "The method of $Name is already $Static";
        Write-Progress -Activity $message;
        Start-Sleep -Seconds 2 # This will keep the script running 2 seconds longer and the message visible.
    }
    else {
        Write-Progress -Activity "Changing the method of $Name from $Method to $Static ...";
        $PublicIP.PublicIpAllocationMethod = $Static;
        Set-AzPublicIpAddress -PublicIpAddress $PublicIP;
        Write-Progress -Activity "Querying the method of $Name ...";
        $ModifiedAddress = Get-AzPublicIpAddress -Name $Name -ResourceGroupName $PublicIP.ResourceGroupName
        $NewMethod = $ModifiedAddress.PublicIpAllocationMethod;
        if ($NewMethod -eq $Static) {
            Write-Output "The method for $Name has successfully changed to $Static";
        }
        else {
            Write-Error -Message "Cannot change the method for $Name to $Static, it is still $NewMethod!!!";
        }
    }
}

Write-Progress可能不是您想用來寫出腳本進度的 cmdlet(盡管它的名稱)。 由於我看不到您需要如何進一步處理腳本的 output ,因此您不妨將其替換為Write-Host

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM