【问题标题】:Powershell script write back to sources from drag and dropPowershell脚本通过拖放写回源
【发布时间】:2013-10-16 13:40:48
【问题描述】:

我需要创建一个 powershell 脚本,以用户友好的拖放方式从 CSV 文件中删除引号。我通过此页面了解了脚本的基础知识:

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,但我希望脚本镜像源) .理想情况下,我希望它接受文件和文件夹,并重写源文件。我感觉这将涉及 get-ChildItem 但我不确定如何在当前场景中实现它。我也试过 out-file $file 也没有用。

感谢您的帮助!

【问题讨论】:

    标签: powershell scripting


    【解决方案1】:

    要将修改后的内容写回原始文件,请尝试以下操作:

    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,计算机将开始交换,从而导致性能显着下降。

    【讨论】:

    • 感谢您的帮助,但这似乎不起作用。它将从一个文件中删除引号,但不会从其他文件中删除。有什么想法吗?
    • 知道了。只需完全删除 param() 定义并使用默认参数列表 ($ARGS)。
    • 非常感谢,这很好用!我会将您的答案标记为正确。额外的问题:你知道为什么这会在每个文件的末尾创建一个新行吗?这是我唯一想不通的事情......
    • Out-File 会在内容不以 1 结尾时自动添加一个换行符,Set-Content 也是如此。为避免这种行为,您必须使用 .NET methods 来编写内容。
    • 有趣。我想我会坚持我现在所拥有的,但我会记住这一点。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2013-05-15
    • 2014-10-11
    相关资源
    最近更新 更多