PowerShell:如何格式化根据 csv 文件中的行数重命名 pdf 的脚本?
PowerShell: How to format a script that renames pdf's based on the number of rows in a csv file?
我有一个 PowerShell 脚本,它会根据压缩文件夹的名称重命名 pdf。压缩 (zipped) 文件夹内有一个 excel (.csv) 文件。
例如:
压缩 (zipped) 文件夹 - 23579_ADV.zip(包含 excel (.csv) 文件 - ADV_Mailer.csv)
pdf - ADVVPrintOutput_0001 & ADVVPrintOutput_0002
最终结果 - ADV_23579_Pr01_1-5000.pdf & ADV_23579_Pr02_5001-10000.pdf
期望的结果,因为包含的 csv 有 8750 行:
ADV_23579_Pr01_1-5000.pdf & ADV_23579_Pr02_5001-8750.pdf
以下 PowerShell 脚本的问题是 pdf 名称需要包含 excel (.csv) 文件中包含的可变行数。
pdf 名称需要按 5000 进行细分。下面是脚本:
If (Test-Path D:\WORK\JetLetter\ABC\ABC_VL_Hot\*.zip) {
$source=Get-ChildItem "D:\WORK\JetLetter\ABC\ABC_VL_Hot\*.zip" | select -Last 1
$JobID = "ABC_" + $source.BaseName.Split('_')[0]
Echo $source.name
Echo $JobID
If (Test-Path ABCPrintOutput0001.pdf) {
Rename-Item ABCPrintOutput0001.pdf "$($JobID)_Pr01_1-5000.pdf"
}
If (Test-Path ABCPrintOutput0002.pdf) {
Rename-Item ABCPrintOutput0002.pdf "$($JobID)_Pr02_5001-10000.pdf"
}
我找到了一个可以计算行数的命令行。我只需要一种将结果传达给 Rename-Item 的方法。
Import-Csv *.csv | Measure-Object | Select-Object -expand count
根据 Dilly B 的回答,我重新格式化了 PowerShell 脚本。
If (Test-Path D:\WORK\JetLetter\JWH\JWH_Tr_Hot\*.zip){
$source=Get-ChildItem "D:\WORK\JetLetter\JWH\JWH_Tr_Hot\*.zip" | select -Last 1
Expand-Archive -Path *.zip -DestinationPath D:\WORK\JetLetter\JWH\JWH_Tr_Hot\
Rename-Item -Path "JWH_Mailer.csn" -NewName "JWH_Mailer.csv"
$csvFile = 'D:\WORK\JetLetter\JWH\JWH_Tr_Hot\JWH_Mailer.csv'
$lineCount = Import-Csv $csvFile | Measure-Object | Select-Object -expand count #Counting lines of a CSV File
$JobID = "JWH_" + $source.BaseName.Split('_')[0]
Echo $source.name
Echo $JobID
If (Test-Path JWHPrintOutput_0001.pdf){
if( $lineCount -lt 5000 ){
Rename-Item JWHPrintOutput_0001.pdf "$($JobID)_Pr01_1" + $lineCount + ".pdf"}
elseif( $lineCount -gt 5000){
Rename-Item JWHPrintOutput_0001.pdf "$($JobID)_Pr01_1-5000.pdf"}
}
If (Test-Path JWHPrintOutput_0002.pdf){
if( $lineCount -lt 10000 ){
Rename-Item JWHPrintOutput_0002.pdf "$($JobID)_Pr02_5001" + $lineCount + ".pdf"}
elseif( $lineCount -gt 10000){
Rename-Item JWHPrintOutput_0002.pdf "$($JobID)_Pr02_5001-10000.pdf"}
}
}
当我 运行 脚本时,它给我以下错误。
Expand-Archive:路径“”不存在或不是有效的文件系统路径。
在 D:\WORK\JetLetter\JWH\JWH_Tr\PrtOutpt_NameChange.ps1:4 char:1
- Expand-Archive -Path *.zip -DestinationPath D:\WORK\JetLetter\JWH\JWH ...
-
+ CategoryInfo : InvalidArgument: (:String) [Expand-Archive], IOException
+ FullyQualifiedErrorId : PathNotFound,Expand-Archive
重命名项目:无法重命名,因为 'JWH_Mailer.csn' 处的项目不存在。
在 D:\WORK\JetLetter\JWH\JWH_Tr\PrtOutpt_NameChange.ps1:5 char:1
- 重命名项目-路径“JWH_Mailer.csn”-新名称“JWH_Mailer.csv”
-
+ CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
134721_JWH.zip
JWH_134721
我仍然不确定您将如何匹配您的 csv 文件和 pdf 文件。我已经给你一个一对一匹配的参考脚本了。
$csvFile = 'C:\PS\Sample-Spreadsheet-5000-rows.csv' #CSV file having 5000 lines
$pdfFile = 'C:\PS\Sample.pdf' # A PDF file
$pdfFileName = (Get-Item $pdfFile).BaseName #Get pdf file basename
$lineCount = Import-Csv $csvFile | Measure-Object | Select-Object -expand count #Counting lines of a CSV File
if(Test-Path $pdfFile){
# Condition to check if linecount is lesser than equal to 5000
if( $lineCount -lt 5000 ){
Rename-Item $pdfFile "ABC_$($pdfFileName)_Pro01_1-5000.pdf"
}
# Condition to check if linecount is greater than equal to 5000 or lesser than equal to 10000
elseif( ($lineCount -gt 5000) -and ($lineCount -lt 10000) ) {
Rename-Item $pdfFile"ABC_$($pdfFileName)_Pro02_5001-10000.pdf"
}
} else { #If File Not found
Write-Output "File Not Found"
}
如果您有多个 PDF 和 CSV,请使用 foreach 并继续。
谢谢!
多亏了 Dilly B,我才能够解决这个问题。这是在可变数据打印环境中。它根据艺术和邮寄记录生成多种 pdf。
下面的 PowerShell 查看邮件列表并根据邮件列表中的记录数重命名 pdf。
If (Test-Path D:\WORK\JetLetter\ABC\ABC_A001_Hot\*.zip){
$source=Get-ChildItem "D:\WORK\JetLetter\ABC\ABC_A001_Hot\*.zip" | select -Last 1
Expand-Archive -Path D:\WORK\JetLetter\ABC\ABC_A001_Hot\*.Zip -DestinationPath D:\WORK\JetLetter\ABC\ABC_A001_Hot\ -Force
Rename-Item -Path "D:\WORK\JetLetter\ABC\ABC_A001_Hot\ABC_Mailer.csn" -NewName "D:\WORK\JetLetter\ABC\ABC_A001_Hot\ABC_Mailer.csv"
$csvFile = 'D:\WORK\JetLetter\ABC\ABC_A001_Hot\ABC_Mailer.csv'
$lineCount = Import-Csv $csvFile | Measure-Object | Select-Object -expand count #Counting lines of a CSV File
$JobID = "ABC_" + $source.BaseName.Split('_')[0]
Echo $source.name
Echo $JobID
If (Test-Path D:\WORK\JetLetter\ABC\ABC_A001_9835\ABCPrintOutput0001.pdf){
if( $lineCount -lt 5000 ){
Rename-Item ABCPrintOutput0001.pdf "$($JobID)_Pr01_1_$lineCount.pdf"}
elseif( $lineCount -gt 5000){
Rename-Item ABCPrintOutput0001.pdf "$($JobID)_Pr01_1-5000.pdf"}
}
If (Test-Path D:\WORK\JetLetter\ABC\ABC_A001_9835\ABCPrintOutput0002.pdf){
if( $lineCount -lt 10000 ){
Rename-Item ABCPrintOutput0002.pdf "$($JobID)_Pr02_5001_$lineCount.pdf"}
elseif( $lineCount -gt 10000){
Rename-Item ABCPrintOutput0002.pdf "$($JobID)_Pr02_5001-10000.pdf"}
}
}
Remove-Item D:\WORK\JetLetter\JWH\JWH_Tr_Hot\JWH_Mailer.csv
我有一个 PowerShell 脚本,它会根据压缩文件夹的名称重命名 pdf。压缩 (zipped) 文件夹内有一个 excel (.csv) 文件。
例如:
压缩 (zipped) 文件夹 - 23579_ADV.zip(包含 excel (.csv) 文件 - ADV_Mailer.csv)
pdf - ADVVPrintOutput_0001 & ADVVPrintOutput_0002
最终结果 - ADV_23579_Pr01_1-5000.pdf & ADV_23579_Pr02_5001-10000.pdf
期望的结果,因为包含的 csv 有 8750 行:
ADV_23579_Pr01_1-5000.pdf & ADV_23579_Pr02_5001-8750.pdf
以下 PowerShell 脚本的问题是 pdf 名称需要包含 excel (.csv) 文件中包含的可变行数。 pdf 名称需要按 5000 进行细分。下面是脚本:
If (Test-Path D:\WORK\JetLetter\ABC\ABC_VL_Hot\*.zip) {
$source=Get-ChildItem "D:\WORK\JetLetter\ABC\ABC_VL_Hot\*.zip" | select -Last 1
$JobID = "ABC_" + $source.BaseName.Split('_')[0]
Echo $source.name
Echo $JobID
If (Test-Path ABCPrintOutput0001.pdf) {
Rename-Item ABCPrintOutput0001.pdf "$($JobID)_Pr01_1-5000.pdf"
}
If (Test-Path ABCPrintOutput0002.pdf) {
Rename-Item ABCPrintOutput0002.pdf "$($JobID)_Pr02_5001-10000.pdf"
}
我找到了一个可以计算行数的命令行。我只需要一种将结果传达给 Rename-Item 的方法。
Import-Csv *.csv | Measure-Object | Select-Object -expand count
根据 Dilly B 的回答,我重新格式化了 PowerShell 脚本。
If (Test-Path D:\WORK\JetLetter\JWH\JWH_Tr_Hot\*.zip){
$source=Get-ChildItem "D:\WORK\JetLetter\JWH\JWH_Tr_Hot\*.zip" | select -Last 1
Expand-Archive -Path *.zip -DestinationPath D:\WORK\JetLetter\JWH\JWH_Tr_Hot\
Rename-Item -Path "JWH_Mailer.csn" -NewName "JWH_Mailer.csv"
$csvFile = 'D:\WORK\JetLetter\JWH\JWH_Tr_Hot\JWH_Mailer.csv'
$lineCount = Import-Csv $csvFile | Measure-Object | Select-Object -expand count #Counting lines of a CSV File
$JobID = "JWH_" + $source.BaseName.Split('_')[0]
Echo $source.name
Echo $JobID
If (Test-Path JWHPrintOutput_0001.pdf){
if( $lineCount -lt 5000 ){
Rename-Item JWHPrintOutput_0001.pdf "$($JobID)_Pr01_1" + $lineCount + ".pdf"}
elseif( $lineCount -gt 5000){
Rename-Item JWHPrintOutput_0001.pdf "$($JobID)_Pr01_1-5000.pdf"}
}
If (Test-Path JWHPrintOutput_0002.pdf){
if( $lineCount -lt 10000 ){
Rename-Item JWHPrintOutput_0002.pdf "$($JobID)_Pr02_5001" + $lineCount + ".pdf"}
elseif( $lineCount -gt 10000){
Rename-Item JWHPrintOutput_0002.pdf "$($JobID)_Pr02_5001-10000.pdf"}
}
}
当我 运行 脚本时,它给我以下错误。
Expand-Archive:路径“”不存在或不是有效的文件系统路径。 在 D:\WORK\JetLetter\JWH\JWH_Tr\PrtOutpt_NameChange.ps1:4 char:1
- Expand-Archive -Path *.zip -DestinationPath D:\WORK\JetLetter\JWH\JWH ...
-
+ CategoryInfo : InvalidArgument: (:String) [Expand-Archive], IOException + FullyQualifiedErrorId : PathNotFound,Expand-Archive
重命名项目:无法重命名,因为 'JWH_Mailer.csn' 处的项目不存在。 在 D:\WORK\JetLetter\JWH\JWH_Tr\PrtOutpt_NameChange.ps1:5 char:1
- 重命名项目-路径“JWH_Mailer.csn”-新名称“JWH_Mailer.csv”
-
+ CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
134721_JWH.zip JWH_134721
我仍然不确定您将如何匹配您的 csv 文件和 pdf 文件。我已经给你一个一对一匹配的参考脚本了。
$csvFile = 'C:\PS\Sample-Spreadsheet-5000-rows.csv' #CSV file having 5000 lines
$pdfFile = 'C:\PS\Sample.pdf' # A PDF file
$pdfFileName = (Get-Item $pdfFile).BaseName #Get pdf file basename
$lineCount = Import-Csv $csvFile | Measure-Object | Select-Object -expand count #Counting lines of a CSV File
if(Test-Path $pdfFile){
# Condition to check if linecount is lesser than equal to 5000
if( $lineCount -lt 5000 ){
Rename-Item $pdfFile "ABC_$($pdfFileName)_Pro01_1-5000.pdf"
}
# Condition to check if linecount is greater than equal to 5000 or lesser than equal to 10000
elseif( ($lineCount -gt 5000) -and ($lineCount -lt 10000) ) {
Rename-Item $pdfFile"ABC_$($pdfFileName)_Pro02_5001-10000.pdf"
}
} else { #If File Not found
Write-Output "File Not Found"
}
如果您有多个 PDF 和 CSV,请使用 foreach 并继续。 谢谢!
多亏了 Dilly B,我才能够解决这个问题。这是在可变数据打印环境中。它根据艺术和邮寄记录生成多种 pdf。 下面的 PowerShell 查看邮件列表并根据邮件列表中的记录数重命名 pdf。
If (Test-Path D:\WORK\JetLetter\ABC\ABC_A001_Hot\*.zip){
$source=Get-ChildItem "D:\WORK\JetLetter\ABC\ABC_A001_Hot\*.zip" | select -Last 1
Expand-Archive -Path D:\WORK\JetLetter\ABC\ABC_A001_Hot\*.Zip -DestinationPath D:\WORK\JetLetter\ABC\ABC_A001_Hot\ -Force
Rename-Item -Path "D:\WORK\JetLetter\ABC\ABC_A001_Hot\ABC_Mailer.csn" -NewName "D:\WORK\JetLetter\ABC\ABC_A001_Hot\ABC_Mailer.csv"
$csvFile = 'D:\WORK\JetLetter\ABC\ABC_A001_Hot\ABC_Mailer.csv'
$lineCount = Import-Csv $csvFile | Measure-Object | Select-Object -expand count #Counting lines of a CSV File
$JobID = "ABC_" + $source.BaseName.Split('_')[0]
Echo $source.name
Echo $JobID
If (Test-Path D:\WORK\JetLetter\ABC\ABC_A001_9835\ABCPrintOutput0001.pdf){
if( $lineCount -lt 5000 ){
Rename-Item ABCPrintOutput0001.pdf "$($JobID)_Pr01_1_$lineCount.pdf"}
elseif( $lineCount -gt 5000){
Rename-Item ABCPrintOutput0001.pdf "$($JobID)_Pr01_1-5000.pdf"}
}
If (Test-Path D:\WORK\JetLetter\ABC\ABC_A001_9835\ABCPrintOutput0002.pdf){
if( $lineCount -lt 10000 ){
Rename-Item ABCPrintOutput0002.pdf "$($JobID)_Pr02_5001_$lineCount.pdf"}
elseif( $lineCount -gt 10000){
Rename-Item ABCPrintOutput0002.pdf "$($JobID)_Pr02_5001-10000.pdf"}
}
}
Remove-Item D:\WORK\JetLetter\JWH\JWH_Tr_Hot\JWH_Mailer.csv