2012-05-22 25 views
1

原諒新手問題,我是新來的PowerShell,並試圖做一些應該很容易!從powershell中的文本文件中讀取多個值然後操作值

我有以下內容

DEVICE ID: {E24CF707-F030-48DC-8E1A-59B96148BF52} 
DEVICE NAME: All Devices (RAINBOW-SRV) 
TYPE:  Drive pool 
DEVICE ID: {D16DC75F-8A8B-4AEC-A411-9B0BC58CBF16} 
DEVICE NAME: HP 1 
TYPE:  Drive 
DEVICE ID: {F2D2AB4A-1FBE-4158-AB62-6A94AE4392E2} 
DEVICE NAME: RAINBOW-SRV 
TYPE:  Machine 
DEVICE ID: {23AD5D42-00A8-496B-96E5-1F5CAA3F9E9D} 
DEVICE NAME: Symantec Protection Network (RAINBOW-SRV) 
TYPE:  Symantec Protection Network 
RETURN VALUE: 1 

我試圖讓後面的設備名字符串文本文件:在每種情況到一個數組來進一步傳遞給一個命令下來就行了。我試過下面的代碼,但得到一個錯誤,指出Substring不是一個有效的方法。

我覺得我失去了一些非常明顯的東西,但看不到它!任何幫助將非常感激。

非常感謝

+2

我想你忘了粘貼代碼? – nimizen

回答

1

讀取文件內容,過濾開頭的行「設備名稱:」,每行刪除(有沒有更換)「設備名稱:」

Get-Content devices.txt | Where-Object {$_ -like 'DEVICE NAME:* '} | Foreach-Object {$_ -repla 
ce '^DEVICE NAME: '} 

All Devices (RAINBOW-SRV) 
HP 1 
RAINBOW-SRV 
Symantec Protection Network (RAINBOW-SRV) 

更新:每OT請求,如何將值傳遞給可執行命令

Get-Content devices.txt | 
Where-Object {$_ -like 'DEVICE NAME:* '} | 
Foreach-Object { 
    $device = $_ -replace '^DEVICE NAME: ' 
    app.exe "$device" 
} 
+0

對不起,我忘了代碼! – steveo448

+0

$ a = Get-Content C:\ NetESP \ BackupTapeCheck \ DriveDetails.txt |選擇字符串「DEVICE NAME:」 foreach($ line in $ a){$ line.Substring(13)} – steveo448

+1

它不起作用,因爲$ line是MatchInfo對象,它沒有Substring方法。你必須引用它的Line屬性:$ line.line.Substring(13)。你也可以將其轉換爲字符串,如:「$ line」.Substring(13)或$ line.ToString()。Substring(13) –

1

另一種解決方案:

$list = @((get-content devices.txt) | where { $_ -match "DEVICE NAME:\s*(?<Device>.+)\s*" } | %{ $matches["Device"] }) 

$list 
+0

我經常使用這種方法。 – marceljg

0

又一解決方案:

Get-Content -Path .\devices.txt | 
    Select-String 'DEVICE NAME: ' | 
     Foreach-Object { 
      $_.ToString() -replace '^DEVICE NAME: ','app.exe ' 
     } 
相關問題