2016-08-30 78 views
0

需要專家的幫助,你需要專家的幫助(3天后嘗試自己的大聲笑)。這裏是我的腳本失敗的部分:Powershell報價使用現狀

$yy=(get-date).Year 

Invoke-Command -ComputerName *ipaddress* -Credential $moveitcred { 
move-item -path "C:\iCApps\Dev\LetterGenerator\Letters\FTS\EDMS\*.txt" -destination "C:\Moveitft\Dev\Letters\Outbound" -force 
Start-Process -FilePath "C:\Program Files\7-Zip\7z.exe" -ArgumentList "a -y C:\Moveitft\Dev\Letters\archive\Letters$yy_.zip C:\Moveitft\Dev\Letters\Outbound\*.*" 
} 

該舉措正常工作。和拉鍊工作正常,除非我想包括年變量($ YY)在參數列表中。 Powershell不想填充變量來調整文件名。要麼是引用了$ null,要麼是在$ yy應該是空白的情況下完成工作。

如果我從提示符運行$ yy,它確實會返回正確的年份值,所以我猜測它是不正確使用引號。但經過3天的搜索,我自己嘗試了各種組合,現在我正在扔毛巾。任何幫助/指導將大大如此讚賞:)

回答

0

試過以上,謝謝!我認爲這可能歸結爲PowerShell版本。我試圖在運行powershell v2.0的服務器上對另一臺2012服務器執行此操作。

我已經縮短下來的代碼只是問題(這樣我就可以「F8」它測試的結果),這是該行: 調用命令-ComputerName ip地址 -Credential $ {moveitcred開始 -Process -FilePath「C:\ Program Files \ 7-Zip \ 7z.exe」-argumentlist「a -y C:\ Moveitft \ Dev \ Letters \ archive \ Letters $ {yy} .zip C:\ Moveitft \ Dev \字母\出站*。*「 }

您的兩條建議」工作「,因爲命令處理,但它仍然沒有正確讀取變量。這是我得到的結果.ZIP

enter image description here

我想它的PowerShell中的原因,如果我複製/粘貼我自己的生產機器上的相同的命令到PowerShell的4.0版是監守,你可以通過顏色編碼立即看到「$ yy」被視爲一個變量,因爲它變成了紅色 - 然後代碼在我的PS4.0機器上正常工作。

在PSv2.0服務器上,我試圖讓它運行,「-argumentlist」的同一行出現所有褐色/棕色 - 包括$ yy部分。所以它的一種暗示是否適合我。

+0

是否有理由認爲目標服務器的年份與執行調用的年份不同?嘗試在啓動進程行之前在腳本塊中聲明$ yy,然後查看是否得到了你需要的內容。否則,你可能不得不使用-ArgumentList和Invoke-Command – notjustme

+0

正確!也感謝mjsr的高級管理人員,他們昨天真的很想念這個問題。然後對你來說,以及誰今天早上確認它:)這解決了它 - 在腳本塊中聲明! –

1

問題不在於引用是關於變量的範圍。在你正在執行的scriptblock內部,powershell對變種$yy var一無所知。所以你需要告訴它在哪裏獲得價值。你可以使用argumentList參數來做到這一點。我看到你已經這樣做了,但是你做錯了(move-item不支持該參數)。看下面的例子來把握這個概念,我認爲你會解決你的問題:

# this is fine and simple 
$yy="Hello scriptblocks!" 
Invoke-Command -ScriptBlock { "whatever you want to run that use the an external var. $yy" } -ArgumentList $yy 

# this is incorrect 
Invoke-Command -ScriptBlock { "whatever you want to run that use the an external var. $yyCarefulWithThisText" } -ArgumentList $yy 

# this shows how you could resolve the variable when you want to put text around 
Invoke-Command -ScriptBlock { "whatever you want to run that use the an external var. $($yy)CarefulWithThisText" } -ArgumentList $yy 

# output1: whatever you want to run that use the an external var. Hello scriptblocks! 
# output2: whatever you want to run that use the an external var. 
# output3: whatever you want to run that use the an external var. Hello scriptblocks!CarefulWithThisText