PowerShell - 抱歉,我们无法找到Microsoft.PowerShell.Core \ FileSystem ::

时间:2016-11-02 19:18:29

标签: powershell

我尝试修改由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。它是否可能被移动,重命名或删除?

有人对解决这个问题有任何想法吗?

谢谢,

2 个答案:

答案 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 }