如何写回使用通配符路径读取的同一个文件?
How can I write back to same file I read from using a wildcard path?
我正在使用以下 PowerShell 脚本删除 .CSV 文件中的引号:
(gc C:\TestQualifier*.csv) | % {$_ -replace '"', ""} | out-file C:\TestQualifier.csv -Fo -En ascii
文件将始终命名为 TestQualifier,但文件名末尾可能带有日期和时间戳(例如 TestQualifier10082017091010)。通配符在源头处理这个问题,但我不知道如何将源文件名写入输出文件名。 Out-File
不接受通配符。
理想情况下,我还想在输出文件时覆盖现有文件。
任何帮助都会很棒。
您需要解析路径,理想情况下,将其保存在变量中以便在管道中使用它。
$path = Resolve-Path C:\TestQualifier*.csv | Select -Expand Path
Resolve-Path
独立于 returns System.Management.Automation.PathInfo
个对象,所以我们扩展路径 属性 来得到它。
因此假设只有一个路径匹配该过滤器,它现在作为字符串存储在 $path
.
中
(Get-Content $path) | ForEach-Object{$_ -replace '"', ""} | Out-File $path -Force -Encoding ascii
如果这是一次性代码,没关系,但如果您打算以后使用它,避免使用别名并使用完整的参数名称可能更容易。
使用完整的命令和参数名称使代码现在和以后都更易于阅读。
如果必须使用通配符处理多个文件:
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
}
提供另一种解决方案,它使用 -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
包含每个管道处理步骤中 Get-Item
输出的 [System.IO.FileInfo]
实例,允许后续管道命令中的脚本块引用它。
我正在使用以下 PowerShell 脚本删除 .CSV 文件中的引号:
(gc C:\TestQualifier*.csv) | % {$_ -replace '"', ""} | out-file C:\TestQualifier.csv -Fo -En ascii
文件将始终命名为 TestQualifier,但文件名末尾可能带有日期和时间戳(例如 TestQualifier10082017091010)。通配符在源头处理这个问题,但我不知道如何将源文件名写入输出文件名。 Out-File
不接受通配符。
理想情况下,我还想在输出文件时覆盖现有文件。
任何帮助都会很棒。
您需要解析路径,理想情况下,将其保存在变量中以便在管道中使用它。
$path = Resolve-Path C:\TestQualifier*.csv | Select -Expand Path
Resolve-Path
独立于 returns System.Management.Automation.PathInfo
个对象,所以我们扩展路径 属性 来得到它。
因此假设只有一个路径匹配该过滤器,它现在作为字符串存储在 $path
.
(Get-Content $path) | ForEach-Object{$_ -replace '"', ""} | Out-File $path -Force -Encoding ascii
如果这是一次性代码,没关系,但如果您打算以后使用它,避免使用别名并使用完整的参数名称可能更容易。
使用完整的命令和参数名称使代码现在和以后都更易于阅读。
如果必须使用通配符处理多个文件:
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
}
提供另一种解决方案,它使用 -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
包含每个管道处理步骤中 Get-Item
输出的 [System.IO.FileInfo]
实例,允许后续管道命令中的脚本块引用它。