2015-04-24 36 views
0

我發現在嘗試使用PowerShell版本3或4時在此頁面上出現語法錯誤的任何人都可以幫助解決問題嗎?{foreach循環中使用的PowerShell語法錯誤

http://jeffwouters.nl/index.php/2012/06/scvmm-custom-inventory-about-vm-and-vhd-with-powershell/

$VMS = Get-VM -VMMServer localhost | Sort-Object -Property Name -Descending 
「<HTML><HEAD><TITLE>VM Inventory</TITLE></HEAD><BODY><TABLE BORDER=1>」 |  Out-File $Env:Temp\VMInventory.html 
「<TR><TD>VM Name</TD><TD>VM Memory</TD><TD>VHD Name</TD><TD>VHD   Length</TD><TD>VHD Maximum</TD><TD>VHD Available</TD><TD>VHD Free %</TD></TR>」  | Out-File $Env:Temp\VMInventory.html -Append 
foreach ($VM in $VMS) 
{ 
「<TR><TD>」+$VM.Name+」</TD><TD>」+$VM.Memory+」MB</TD><TD>.</TD><TD>.</TD><TD>. </TD><TD>.</TD><TD>.</TD></TR>」 | Out-File $Env:Temp\VMInventory.html  -Append 
foreach ($VHD in $VM.VirtualHarddisks) 
{ 
$VHDLength = ($VHD.Size/1GB) 
$VHDSize = 「{0:N2}」 -f $VHDLength 
if ($VHD.VHDType -eq 「DynamicallyExpanding」) 
{ 
$BackgroundColor = 「#FF0000″ 
$VHDMaximumSize = 「{0:N2}」 -f ($VHD.MaximumSize/1GB) 
$VHDAvailable = 「{0:N2}」 -f (($VHD.MaximumSize – $VHD.Size) /1GB) 
$VHDFree = 「{0:N2}」 -f (100 – (($VHD.Size * 100)/$VHD.MaximumSize)) 
「<TR><TD>.</TD><TD>.</TD> 
<TD bgcolor=」+$BackgroundColor+」>」+$VHD.Name+」</TD> 
<TD bgcolor=」+$BackgroundColor+」>」+$VHDSize+」GB</TD> 
<TD bgcolor=」+$BackgroundColor+」>」+$VHDMaximumSize+」</TD> 
<TD bgcolor=」+$BackgroundColor+」>」+$VHDAvailable+」</TD> 
<TD bgcolor=」+$BackgroundColor+」>」+$VHDFree+」 %</TD></TR>」 | Out-File   $Env:Temp\VMInventory.html -Append 
} 
else 
{ 
「<TR><TD>.</TD><TD>.</TD><TD>」+$VHD.Name+」</TD><TD>」+$VHDSize+」GB</TD><TD>.< /TD><TD>.</TD><TD>.</TD></TR>」 | Out-File $Env:Temp\VMInventory.html -Append 
} 
} 
「<TR>」 | Out-File $Env:Temp\vminventory.html -Append 
} 
「</TABLE><BODY></HTML>」 | Out-File $Env:Temp\VMInventory.html -Append 
Invoke-Expression $Env:Temp\vminventory.html 
+1

是否更換所有這些「智能引號」定期引號幫助嗎?我意識到格式化問題不是你的,但更容易格式化代碼可能會有所幫助。 –

+0

這裏至少有三個不同的字符用於智能引用。 '''',''''和'''。 Wouters先生需要修復他的網站,以免損壞他發佈的代碼。 –

+0

它不僅僅是引號。中間有一個字符串,需要轉義/處理的嵌套引號以'「。 Matt

回答

2

唯一的問題似乎是智能引號。我也花時間縮進代碼,因爲它使它更具可讀性。我無法自己運行,但語法現在看起來正確。

$VMS = Get-VM -VMMServer localhost | Sort-Object -Property Name -Descending 
"<HTML><HEAD><TITLE>VM Inventory</TITLE></HEAD><BODY><TABLE BORDER=1>" | Out-File $Env:Temp\VMInventory.html 
"<TR><TD>VM Name</TD><TD>VM Memory</TD><TD>VHD Name</TD><TD>VHD   Length</TD><TD>VHD Maximum</TD><TD>VHD Available</TD><TD>VHD Free %</TD></TR>"  | Out-File $Env:Temp\VMInventory.html -Append 
foreach ($VM in $VMS){ 
"<TR><TD>"+$VM.Name+"</TD><TD>"+$VM.Memory+"MB</TD><TD>.</TD><TD>.</TD><TD>. </TD><TD>.</TD><TD>.</TD></TR>" | Out-File $Env:Temp\VMInventory.html  -Append 
    foreach ($VHD in $VM.VirtualHarddisks){ 
    $VHDLength = ($VHD.Size/1GB) 
    $VHDSize = "{0:N2}" -f $VHDLength 
     if ($VHD.VHDType -eq "DynamicallyExpanding"){ 
      $BackgroundColor = "#FF0000" 
      $VHDMaximumSize = "{0:N2}" -f ($VHD.MaximumSize/1GB) 
      $VHDAvailable = "{0:N2}" -f (($VHD.MaximumSize – $VHD.Size) /1GB) 
      $VHDFree = "{0:N2}" -f (100 – (($VHD.Size * 100)/$VHD.MaximumSize)) 

      "<TR><TD>.</TD><TD>.</TD> 
      <TD bgcolor="+$BackgroundColor+">"+$VHD.Name+"</TD> 
      <TD bgcolor="+$BackgroundColor+">"+$VHDSize+"GB</TD> 
      <TD bgcolor="+$BackgroundColor+">"+$VHDMaximumSize+"</TD> 
      <TD bgcolor="+$BackgroundColor+">"+$VHDAvailable+"</TD> 
      <TD bgcolor="+$BackgroundColor+">"+$VHDFree+" %</TD></TR>" | Out-File $Env:Temp\VMInventory.html -Append 
     }else{ 
      "<TR><TD>.</TD><TD>.</TD><TD>"+$VHD.Name+"</TD><TD>"+$VHDSize+"GB</TD><TD>.< /TD><TD>.</TD><TD>.</TD></TR>" | Out-File $Env:Temp\VMInventory.html -Append 
     } 
    } 
    "<TR>" | Out-File $Env:Temp\vminventory.html -Append 
} 

"</TABLE><BODY></HTML>" | Out-File $Env:Temp\VMInventory.html -Append 
Invoke-Expression $Env:Temp\vminventory.html 

如果你覺得到它的代碼看起來像它會從創建自定義對象,並使用ConvertTo-HTML受益。是的,你會失去顏色格式,但它只是一個供參考。

+0

你真的不需要在HTML中轉義那些引號。 ''與 –

+0

@BaconBits一樣有效。可以肯定地刪除。代碼似乎沒有他們罰款....是的,這只是聰明的引號。 – Matt

+0

夠公平的。無論哪種方式,對於比'Export-Csv'稍微有用的東西來說,這是一個巨大的混亂,並且只比ConvertTo-Html或Out-GridView更適中。 –

2

這是那些捲曲的引號。嘗試用正常的直引號替換它們。 「」與 「」

的Mac OSX

ALT +]產生一個開口單個捲曲引號( ')

ALT + SHIFT +]產生一個閉合單個捲曲引號(')

ALT + [產生一個開口雙捲曲引號(「)

ALT + SHIFT + [產生右雙捲曲引號(」)

視窗

ALT + 0145產生的開口單個捲曲引號( ')

ALT + 0146產生一個閉合單個捲曲引號(')

ALT + 0147產生的開口雙捲曲引號(「)

ALT + 0148產生結束的雙捲曲引號(」)

+0

非常有用的信息瑞恩。 –

0

這裏的問題是不使用智能引號s本身; Powershell支持對字符串使用智能報價U+201CU+201D。問題是具體線路:

$BackgroundColor = 「#FF0000″ 

與一個有效的Unicode 'LEFT DOUBLE QUOTATION MARK' (U+201C)開始的字符串,但試圖與不被識別爲一個字符串報價的Unicode字符'DOUBLE PRIME' (U+2033)結束它。

從PowerShell的規範中的相關規則是:

double-quote-character: 
    " (U+0022) 
    Left double quotation mark (U+201C) 
    Right double quotation mark (U+201D) 
    Double low-9 quotation mark (U+201E) 

和單引號的字符串:

single-quote-character: 
    ' (U+0027) 
    Left single quotation mark (U+2018) 
    Right single quotation mark (U+2019) 
    Single low-9 quotation mark (U+201A) 
    Single high-reversed-9 quotation mark (U+201B)