2015-12-19 88 views
0

我想製作一個用於查找和替換文件中多個字符串的小腳本(使用批處理和PowerShell組合)。這些文件總是不同的,所以我總是需要進入批處理並更改文件名Get-ContentOut-File。 現在我添加了一個提示來插入文件名,我給這個參數,所以我可以以某種方式搜索和編輯$filename.txt例如。由於這個腳本是躺在就像我的文件相同的文件夾查找帶文件名變量的文件(獲取內容)

$filename = Read-Host -Prompt 'Input filename' 
(gc $filename.txt) -replace 'foo', 'bar' | Out-File $filename.txt 

這裏與僅更換一個字符串正常PowerShell代碼(我將在一個批處理文件稍後重新整合這一點)不會需要一條路。

我還發現gc無法讀取變量,這正是我的問題在這裏:我得到一個錯誤代碼,該參數不能綁定到「路徑」,因爲它是NULL。

我找不到別的樣子,發現了很多線程如何出文件中的變量或如何獲得文件內容一個變量,但沒有安裝到我的情況,所以我真的很感激任何幫助你們!

+0

我不明白爲什麼你需要批處理和PowerShell。如果你在PowerShell中工作,那麼我認爲你最好放棄批處理。如果你想使用批處理,那麼你可以考慮我的[JREPL.BAT混合JScript /批處理實用工具](http://www.dostips.com/forum/viewtopic.php?t=6044)。您可以使用SET/P來提示FileName變量的值。然後,你可以簡單地使用'調用jrepl「foo」「bar」/ L/F'%FileName%「/ O -' – dbenham

+0

我想我已經找到了這個批處理,但是我對所有內容都感到困惑哈哈, d實際上只需要在最後添加這部分? 我知道這個/ P選項,但我試圖在一個批處理中與powershell一起使用,並且不起作用 Powershell因爲人們一直在說:既然powershell是預先安裝而不是批量使用 也許因爲和你的批處理一樣,我需要很多代碼才能使批處理工作與PowerShell一樣簡單 我想批量集成它,朋友也可以使用它。所以我需要它儘可能簡單。 – Shoru

回答

1

PowerShell允許使用一個單詞的字符串或變量沒有把他們的報價,因此以下兩個語句將工作:

Get-Content foo.txt 
Get-Content $filename 

不過,如果你想使用在構造一個可變的參數你需要一個字符串,把表達的雙引號:

Get-Content "$filename.txt" 

,或者使用一個子表達式爲串聯變量和字符串:

Get-Content ($filename + '.txt') 

雖這麼說,因爲在你的情況,你正在使用的文件名在多個地方它可能是最好的擴展追加到您的輸入,並使用只是一個變量:

$filename = Read-Host -Prompt 'Input filename' 
$filename += '.txt' 
(Get-Content $filename) -replace 'foo', 'bar' | Set-Content $filename 
+0

Powershell文件(工作): '$ filename =讀取主機 - 提供'輸入文件名' (gc「$ filename.c4d」) - 替換'foo','bar'|設置內容「$文件名。c4d「' Powershell集成的批處理文件: @ECHO OFF powershell -Command」$ filename = Read-Host -Prompt'Input filename'; (gc「$ filename.c4d」) - 替換'foo','bar'| Set-Content「$ filename.c4d」' 另外:Set-Content更準確嗎?我注意到Out-File有點破壞我的文件(.c4d),所以程序無法再讀取它。 – Shoru

+0

@Shoru只需刪除批處理文件並單獨運行PowerShell腳本。如果你還沒有這樣做,先運行'Set-ExecutionPolicy RemoteSigned'。這是毫無意義的(並且如您所見,容易出錯)使用批處理作爲PowerShell的包裝。至於'Set-Content':它不是「更準確」,它只是使用ASCII作爲默認編碼,而「Out-File」使用Unicode(這可能是您的程序無法讀取文件的原因)。 –

+0

我的第一條評論不是因爲某種原因而發送的:'$ filename + ='.txt'在批處理中就像一個魅力一樣工作!感謝那。我只是想知道爲什麼它不會使用雙引號,因爲它的代碼相同。在第一篇文章中提到你的提示:之前我嘗試過'$ filename + ='.txt'',但我想我忘記了單引號,所以它不起作用。 :)好吧,我沒有真正考慮或考慮ASCII和Unicode編碼的差異。 – Shoru