我尝试修改由Boe Prox创建的脚本,该脚本将多个CSV文件合并到一个Excel工作簿中,以便在网络共享上运行。
当我在本地运行它时,脚本执行得很好,并将多个.csv文件合并到一个Excel工作簿中。
Clear-Host
$OutputFile = "ePortalMonthlyReport.xlsx"
$ChildDir = "C:\MonthlyReport\*.csv"
cd "C:\MonthlyReport\"
echo "Combining .csv files into Excel workbook"
. C:\PowerShell\ConvertCSVtoExcel.ps1
Get-ChildItem $ChildDir | ConvertCSVtoExcel -output $OutputFile
echo " "
但是当我将其修改为从网络共享运行并进行以下更改时:
Clear-Host
# Variables
$OutputFile = "ePortalMonthlyReport.xlsx"
$NetworkDir = "\\sqltest2\dev_ePortal\Monthly_Report"
$ChildDir = "\\sqltest2\dev_ePortal\Monthly_Report\*.csv"
cd "\\sqltest2\dev_ePortal\Monthly_Report"
echo "Combining .csv files into Excel workbook"
. $NetworkDir\ConvertCSVtoExcel.ps1
Get-ChildItem $ChildDir | ConvertCSVtoExcel -output $OutputFile
echo " "
我收到一个错误,看起来它使用网络路径两次,我不确定原因:
将.csv文件合并到Excel工作簿
转换\ sqltest2 \ dev_ePortal \ Monthly_Report \ 001_StatsByCounty.csv 命名工作表001_StatsByCounty --done
在temp工作簿中的excel中打开csv Microsoft.PowerShell.Core \ FileSystem :: \ sqltest2 \ dev_ePortal \ Monthly_Report \\ sqltest2 \ dev_ePortal \ Monthly_Report \ 001_StatsByCounty.csv
抱歉,我们无法找到Microsoft.PowerShell.Core \ FileSystem :: \ sqltest2 \ dev_ePortal \ Monthly_Report \\ sqltest2 \ dev_ePortal \ Monthly_Report \ _ 001_StatsByCounty.csv。它是否可能被移动,重命名或删除?
有人对解决这个问题有任何想法吗?
谢谢,
答案 0 :(得分:1)
因为在脚本中它使用以下正则表达式:
[regex]$regex = "^\w\:\\"
匹配以driveletter开头的路径,例如c:\data\file.csv
会匹配而data\file.csv
则不匹配。它使用它,因为(显然)Excel需要一个完整的路径,所以如果文件路径不匹配,它会将当前目录添加到它的前面:
#Open the CSV file in Excel, must be converted into complete path if no already done
If ($regex.ismatch($input)) {
$tempcsv = $excel.Workbooks.Open($input)
}
ElseIf ($regex.ismatch("$($input.fullname)")) {
$tempcsv = $excel.Workbooks.Open("$($input.fullname)")
}
Else {
$tempcsv = $excel.Workbooks.Open("$($pwd)\$input")
}
您的文件路径将是\\server\share\data\file.csv
并且它没有看到驱动器号,因此它会触及最后一个选项并且阻塞$pwd
- 当前工作目录的自动变量 - 到达开头文件路径。
如果编辑脚本并将正则表达式更改为:
,则可能会离开[regex]$regex = "^\w\:\\|^\\\\"
将匹配以\\
开头的路径,并且可以在不更改的情况下使用。
或者也可以编辑最后一个选项(〜第111行)来说...Open("$($input.fullname)")
,就像第二个选项一样。
答案 1 :(得分:0)
很多问题都是在脚本调用$ pwd而不是$ PSScriptRoot的几乎每个实例中引起的。使用快速查找和替换替换所有实例。
$ pwd看起来像:
PS Microsoft.PowerShell.Core\FileSystem::\\foo\bar
$ PSScriptRoot看起来像:
\\foo\bar
我自己修复的第二部分是@TessellatingHeckler所指出的。我采取了更长的方法。
这不是最有效的方式......但对我来说很明显。
[regex]$regex = "^\w\:\\"
[regex]$regex2 = "^\\\\"
$test = 0
If ($regex.ismatch($input) -and $test -eq 0 ) {
$tempcsv = $excel.Workbooks.Open($input)
$test = 1 }
If ($regex.ismatch("$($input.fullname)") -and $test -eq 0) {
$tempcsv = $excel.Workbooks.Open("$($input.fullname)")
$test = 1}
If ($regex2.ismatch($input) -and $test -eq 0) {
$tempcsv = $excel.Workbooks.Open($input)
$test = 1 }
If ($regex2.ismatch("$($input.fullname)") -and $test -eq 0) {
$tempcsv = $excel.Workbooks.Open("$($input.fullname)")
$test = 1}
If ($test -eq 0) {
$tempcsv = $excel.Workbooks.Open("$($PSScriptRoot)\$input")
$test = 0 }