我正在使用以下PowerShell脚本删除.CSV文件中的引号:
(gc C:\TestQualifier*.csv) | % {$_ -replace '"', ""} | out-file C:\TestQualifier.csv -Fo -En ascii
该文件将始终命名为TestQualifier,但可能在文件名末尾标记了日期和时间(例如TestQualifier10082017091010)。通配符在源处理它,但我无法弄清楚如何将源文件名写入输出文件名。 Out-File
不接受通配符。
理想情况下,我还想在输出文件时覆盖现有文件。
任何帮助都会很棒。
答案 0 :(得分:1)
您需要解析路径,理想情况下,将其保存在变量中以将其用于管道。
$path = Resolve-Path C:\TestQualifier*.csv | Select -Expand Path
Resolve-Path
自己返回System.Management.Automation.PathInfo
个对象,所以我们扩展了path属性来获取它。
因此,假设只有一条路径与该过滤器匹配,那么它现在作为字符串存储在$path
中。
(Get-Content $path) | ForEach-Object{$_ -replace '"', ""} | Out-File $path -Force -Encoding ascii
如果这是一次性代码,则无关紧要,但如果您打算稍后再使用它,则可能更容易避免使用别名并使用完整的参数名称。
使用完整的命令和参数名称使代码现在和以后都更容易阅读。
答案 1 :(得分:1)
提供另一种使用-pv
(-PipelineVariable
)公共参数(PSv4 +)的解决方案:
Get-Item C:\TestQualifier*.csv -pv file | % {
(Get-Content $file.FullName) | % { $_ -replace '"' } |
Out-File $file.FullName -Force -Encoding Ascii
}
*在问题中,Get-Content
调用包含在(...)
中以确保整个输入文件是预先读取,这样就可以编写结果返回输入文件。
在这种情况下,并非严格需要.FullName
,但使用它会更安全,因为[System.IO.FileInfo]
实例并不总是字符串转换为文件的完整路径 - 请参阅this GitHub issue
* $_ -replace '"', ""
缩短为$_ -replace '"'
,因为 not 指定替换字符串与指定空字符串相同。
功能
请注意在第一步中使用Get-Item
以检索感兴趣的文件,以及-pv file
如何定义变量$file
,然后表示变量%
。 ForEach-Object
($file
)脚本块
更一般地说,[System.IO.FileInfo]
在每个管道处理步骤中包含Get-Item
? W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.huawei.lcagent.client.LogCollectManager.getUserType()' on a null object reference
? W/System.err: at com.android.server.util.ReportTools.getUserType(ReportTools.java:86)
? W/System.err: at com.android.server.util.ReportTools.isBetaUser(ReportTools.java:73)
? W/System.err: at com.android.server.util.ReportTools.report(ReportTools.java:58)
? W/System.err: at com.android.server.util.HwUserBehaviourRecord.appExitRecord(HwUserBehaviourRecord.java:65)
? W/System.err: at com.android.server.am.ActivityManagerService$UiHandler.handleMessage(ActivityManagerService.java:1572)
? W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
? W/System.err: at android.os.Looper.loop(Looper.java:150)
? W/System.err: at android.os.HandlerThread.run(HandlerThread.java:61)
? W/System.err: at com.android.server.ServiceThread.run(ServiceThread.java:46)
E/ReportTools: This is not beta user build
? I/Process: Sending signal. PID: 10115 SIG: 9
? I/PgedBinderListener: kstate callback type:8 value1=10115 value2=KILLED
实例输出,允许后续管道命令中的脚本块引用它。
答案 2 :(得分:0)
如果必须使用通配符处理多个文件:
ForEach ($File in (gci C:\TestQualifier*.csv)){(gc $File)|%{$_ -replace '"'}|out-file $File -Fo -En ascii}
冗长
ForEach ($File in (Get-ChildItem C:\TestQualifier*.csv)){
(Get-Content $File) | ForEach-Object {
$_ -replace '"'
} | Out-File $File -Force -Encoding ascii
}