2014-12-01 56 views
0

該片段(Get-Content $_.FullName | Select-Object -First 1)被稱爲三次。目的是宣稱它是避免代碼重複的一個變量。如何將包含變量的片段聲明爲變量以避免使用PowerShell進行代碼複製?

Get-ChildItem "$env:ChocolateyInstall\lib\eclipse.*" -Recurse -Filter "eclipseInstall.zip.txt" | 
    ForEach-Object{ if (((Get-Content $_.FullName | Select-Object -First 1) -match "eclipse") -and (Test-Path -Path (Get-Content $_.FullName | Select-Object -First 1))){Remove-Item -Recurse -Force (Get-Content $_.FullName | Select-Object -First 1)}} 

嘗試

$a = (Get-Content $_.FullName | Select-Object -First 1) 

Get-ChildItem "$env:ChocolateyInstall\lib\eclipse.*" -Recurse -Filter "eclipseInstall.zip.txt" | 
    ForEach-Object{ if (($a -match "eclipse") -and (Test-Path -Path (Get-Content $_.FullName | Select-Object -First 1))){Write-Host "hello"}} 

結果

PS C:\Windows\system32> . "C:\temp\powershelltest\test.ps1" 
Get-Content : Cannot bind argument to parameter 'Path' because it is null. 
At C:\temp\powershelltest\test.ps1:1 char:19 
+ $a = (Get-Content $_.FullName | Select-Object -First 1) 
+     ~~~~~~~~~~~ 
    + CategoryInfo   : InvalidData: (:) [Get-Content], ParameterBindingValidationException 
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.GetContentC 
    ommand 
+1

這並不清楚你究竟在做什麼。你能編輯問題並解釋嗎?這個錯誤是因爲你試圖訪問不存在的'$ _',因爲你還沒有創建管道。 – arco444 2014-12-01 15:40:55

+0

@ arco444我正在嘗試避免代碼重複。同樣的片段,即'(Get-Content $ _ FullName | Select-Object-First 1)'此時被調用三次。問題已更新。 – 030 2014-12-01 15:43:26

+0

好的,但_why_?腳本的實際目的是什麼?您正在分配,但您要分配的內容不正確。即使用'$ a =(..)'是好的,但是你不能直接執行'Get-Content $ _.Fullname'而不先進行管道連接。 – arco444 2014-12-01 15:47:40

回答

2

可以一小段代碼分配給像這樣的變量:

$a = { Get-Content $_.FullName | Select-Object -First 1 } 

然後在& $a的任何時候執行片段(您需要將對象傳遞給它)。儘管如此,我不確定這是否有必要。

+0

需要'&$ a'才能使其工作。謝謝。 – 030 2014-12-05 15:45:15