将 Powershell 输出通过管道传输到文本文件
Piping Powershell output to a text file
我有以下 powershell 脚本,它使用顺序文件名将文件从一个位置重命名为另一个位置。最终,这些文件更改需要映射,如原始 - 新。目前,我只有一个 Write-Host cmdlet,我只是将 cmd windows 输出复制到一个 txt 文件中,然后 运行 通过我编写的 python 脚本来吐出原始文件和重命名的文件到 excel 文件中。我想知道在初始 ps 脚本中是否有更简单的方法来执行此操作。即使是制表符分隔的内容也可以轻松复制粘贴到 excel 文件中。
Set-Location -Path "C:\Users\mmcintyre\Desktop\grail_new"
$destLoc = "C:\Users\mmcintyre\Desktop\renamed"
$countRef = [ref] 0
Get-ChildItem -Filter *.pdf -Recurse |
Copy-Item -WhatIf -Destination { '{0}\{1}.pdf' -f $destLoc,++$countRef.Value }
如有任何帮助,我们将不胜感激。
编辑:我目前使用的是 PS 2.0。
除了复制操作(PSv3+ 语法)之外,以下输出 old-name/new-name 对到 TSV 文件:
$countRef = [ref] 0
Get-ChildItem -Filter *.pdf -Recurse | ForEach-Object {
$newFullName = '{0}\{1}.pdf' -f $destLoc, ++$countRef.Value
Copy-Item -WhatIf -LiteralPath $_.FullName -Destination $newFullName
[pscustomobject] @{
Old = $_.FullName
New = $newFullName
}
} | Export-Csv -Delimiter "`t" NameMappings.tsv
这将创建一个 TSV(制表符分隔值)文件,其中包含名为 Old
和 New
的列,分别包含旧的和新的完整文件名。
PSv2:用于从哈希表创建自定义对象的 [pscustomobject] @{ ... }
语法糖在 v2 中不可用,因此必须使用 New-Object
:
$countRef = [ref] 0
Get-ChildItem -Filter *.pdf -Recurse | ForEach-Object {
$newFullName = '{0}\{1}.pdf' -f $destLoc, ++$countRef.Value
Copy-Item -WhatIf -LiteralPath $_.FullName -Destination $newFullName
New-Object PSCustomObject -Property @{
Old = $_.FullName
New = $newFullName
}
} | Export-Csv -Delimiter "`t" NameMappings.tsv
警告:-Property
接受哈希表[1]
,这意味着不能保证其键顺序,因此结果对象的属性顺序通常不会反映输入顺序 - 在这种情况下,它只是 碰巧 这样做。
如果生成的 属性 顺序不合需要,您有两个选择:
慢,但方便:插入一个 Select-Object
调用,属性按所需顺序(例如,Select-Object Old, New
)。
更麻烦:首先构造空对象New-Object PSCustomObject
,然后通过单独的Add-Member
调用按所需顺序一个接一个地附加属性。
[1] PSv3+ [pscustomobject] @{ ... }
语法似乎也是基于哈希表的,但它是以保留键顺序的方式进行解析的;即,就好像您隐式使用了 [ordered] @{ ... }
.
我有以下 powershell 脚本,它使用顺序文件名将文件从一个位置重命名为另一个位置。最终,这些文件更改需要映射,如原始 - 新。目前,我只有一个 Write-Host cmdlet,我只是将 cmd windows 输出复制到一个 txt 文件中,然后 运行 通过我编写的 python 脚本来吐出原始文件和重命名的文件到 excel 文件中。我想知道在初始 ps 脚本中是否有更简单的方法来执行此操作。即使是制表符分隔的内容也可以轻松复制粘贴到 excel 文件中。
Set-Location -Path "C:\Users\mmcintyre\Desktop\grail_new"
$destLoc = "C:\Users\mmcintyre\Desktop\renamed"
$countRef = [ref] 0
Get-ChildItem -Filter *.pdf -Recurse |
Copy-Item -WhatIf -Destination { '{0}\{1}.pdf' -f $destLoc,++$countRef.Value }
如有任何帮助,我们将不胜感激。
编辑:我目前使用的是 PS 2.0。
除了复制操作(PSv3+ 语法)之外,以下输出 old-name/new-name 对到 TSV 文件:
$countRef = [ref] 0
Get-ChildItem -Filter *.pdf -Recurse | ForEach-Object {
$newFullName = '{0}\{1}.pdf' -f $destLoc, ++$countRef.Value
Copy-Item -WhatIf -LiteralPath $_.FullName -Destination $newFullName
[pscustomobject] @{
Old = $_.FullName
New = $newFullName
}
} | Export-Csv -Delimiter "`t" NameMappings.tsv
这将创建一个 TSV(制表符分隔值)文件,其中包含名为 Old
和 New
的列,分别包含旧的和新的完整文件名。
PSv2:用于从哈希表创建自定义对象的 [pscustomobject] @{ ... }
语法糖在 v2 中不可用,因此必须使用 New-Object
:
$countRef = [ref] 0
Get-ChildItem -Filter *.pdf -Recurse | ForEach-Object {
$newFullName = '{0}\{1}.pdf' -f $destLoc, ++$countRef.Value
Copy-Item -WhatIf -LiteralPath $_.FullName -Destination $newFullName
New-Object PSCustomObject -Property @{
Old = $_.FullName
New = $newFullName
}
} | Export-Csv -Delimiter "`t" NameMappings.tsv
警告:-Property
接受哈希表[1]
,这意味着不能保证其键顺序,因此结果对象的属性顺序通常不会反映输入顺序 - 在这种情况下,它只是 碰巧 这样做。
如果生成的 属性 顺序不合需要,您有两个选择:
慢,但方便:插入一个
Select-Object
调用,属性按所需顺序(例如,Select-Object Old, New
)。更麻烦:首先构造空对象
New-Object PSCustomObject
,然后通过单独的Add-Member
调用按所需顺序一个接一个地附加属性。
[1] PSv3+ [pscustomobject] @{ ... }
语法似乎也是基于哈希表的,但它是以保留键顺序的方式进行解析的;即,就好像您隐式使用了 [ordered] @{ ... }
.