2013-10-16 43 views
1

我需要創建一個PowerShell腳本,以用戶友好的拖放方式從CSV文件中刪除引號。我有腳本的基礎知識之後禮節本頁面:PowerShell腳本回寫到拖放源代碼

http://blogs.technet.com/b/heyscriptingguy/archive/2011/11/02/remove-unwanted-quotation-marks-from-csv-files-by-using-powershell.aspx

而且我已經成功地由名爲.ps1文件拖動和投擲的禮貌這個堆棧溢出問題:

Drag and Drop to a Powershell script

答案的作者暗示,放置單個文件,許多文件和其中包含大量文件的文件夾一樣容易。但是,我還沒有找到可以寫回源文件的方式。這裏是我當前的代碼:

Param([string[]]$file) 
(gc $file) | % {$_ -replace '"', ""} | out-file C:\Users\pfoster\Desktop\Output\test.txt -Fo -En ascii 

目前,這將只接受一個單一的文件,並輸出結果作爲一個txt而不管源文件類型的指定文件(我可以改變這種狀況,以CSV容易,但我d喜歡腳本來鏡像源代碼)。理想情況下,我希望它接受文件和文件夾,並重寫源文件。我有一種感覺,這將涉及get-ChildItem,但我不知道如何在當前情況下實現。我也嘗試了out-file $文件,但這也不起作用。

感謝您的幫助!

回答

0

用於寫入修改後的內容返回到原始文件嘗試這樣的事:

foreach ($file in $ARGS) { 
    (Get-Content $file) -replace '"', '' | Out-File $file -Encoding ASCII -Force 
} 

使用foreach in循環,因爲你在管道不止一個地方需要的文件名。讀取子shell中的內容,然後將修改後的內容傳送到Out-File cmdlet,確保只有在內容已被讀取後,輸出文件才被寫入

不要使用重定向操作符((Get-Content $file) >$file),因爲這將首先打開文件進行寫入(有效截斷文件),然後從現在的空文件中讀取內容。

請注意,這種方法可能會導致大文件出現問題,因爲每個文件在被處理並寫回到磁盤之前都會被完全讀入RAM中。如果文件不適合可用RAM,則計算機將開始交換,從而導致顯着的性能下降。

+0

感謝您的幫助,但這似乎並不奏效。它將從一個文件中除去引號,但不會引用其他文件。有任何想法嗎? – user2748350

+0

明白了。只需刪除'param()'定義並使用默認參數列表('$ ARGS')。 –

+0

非常感謝,這個作品很棒!我會標記你的答案是正確的。獎金問題:你知道爲什麼這會在每個文件的末尾創建一個新行嗎?這是我唯一無法解決的問題...... – user2748350