2015-12-19 50 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