I need help fixing this powershell Unzip and copy script

I’m getting an error message when I run this script.

It does copy the file to the target location.

I will be a scheduled task so I just want to C:\Source$subfolder because it will recurse.

The folder nested will be 20180111 or 20180112

This is the error that I’m getting

xtract: C:\Target\New\20180108/D2_August_27_2017-workspace.xml
New-Object : Exception calling “.ctor” with “2” argument(s): “The directory name is invalid.”
At line:32 char:110

  • … | Out-Null |New-Object IO.FileSystemWatcher $path, $filter -Property …
  •             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : InvalidOperation: (:slight_smile: [New-Object], MethodInvocationException
    • FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

This is the script

Exit if any command/function sees an error

$ErrorActionPreference = “Stop”

function Create-Dir-If-Not-Exist($fullPath) {
if (!(Test-Path $fullPath)) {
Write-Host “Create dir: $fullPath”
New-Item -ItemType Directory -Path $fullPath
}
}

function Unzip($zipfile, $outdir)
{
Add-Type -AssemblyName System.IO.Compression.FileSystem
$zip = [System.IO.Compression.ZipFile]::OpenRead($zipfile)
foreach ($entry in $zip.Entries)
{
$destFilePath = [System.IO.Path]::Combine($outdir, $entry.FullName)
$isDir = ($destFilePath.EndsWith(“") -or $destFilePath.EndsWith(”/"))

    if ($isDir) {
      Create-Dir-If-Not-Exist($destFilePath)
    } else {
      $parentDir = [System.IO.Path]::GetDirectoryName($destFilePath)

      # Sometimes its parent directory is not an entry in $zip.
      # Therefore, we need to make sure its parent dir exists.
      # Also, Create-Dir-If-Not-Exist(..) is an equivalent of `mkdir -p`.
      # Therefore, we don't need to worry about the parent's parent.
      Create-Dir-If-Not-Exist($parentDir)

      Write-Host "Extract: $destFilePath"
      [System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $destFilePath, $true) | Out-Null |New-Object IO.FileSystemWatcher $path, $filter -Property @{

NotifyFilter = [IO.NotifyFilters]‘FileName, LastWrite’
}
}
}
}

$zip_file_path = [IO.Path]::GetFullPath(“C:\Source\20180111\20180108.zip”)
$dest_path = [IO.Path]::GetFullPath(“C:\Target\New”)
Get-Date -DisplayHint Date

Unzip $zip_file_path $dest_path

I left out the part of the script with the email details.

This is the original script before modification:

#powershell Set-ExecutionPolicy RemoteSigned

$Username = “cohen.carryl@gmail.com”;
$Password= “N4ture2017”;

function Send-ToEmail([string]$email, $foldername, $srcOrTarget){

$message = new-object Net.Mail.MailMessage;
$message.From = "ccarrylab@gmail.com";
$message.To.Add($email);

$FileNames = Get-ChildItem -Path $foldername
if(Compare-Object $srcOrTarget "SRC"){
	$message.Subject = "$foldername folder recived ";
	$message.Body = "$FileNames files are received in the source folder";
}else {
	$message.Subject = "$foldername folder copied";
	$message.Body = "$FileNames files are copied in the target folder";

}
$smtp = new-object Net.Mail.SmtpClient("smtp.gmail.com", "587");
$smtp.EnableSSL = $true;
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$smtp.send($message);

}

$srcPath = “C:\Source”
$targetPath = "C:\Users\greatness\Target"
$fname = (get-date).ToString(“yyyMMdd”)
$sourceFolder = “$srcPath$fname”
$targetFolder = “$targetPath$fname”

Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip
{
param([string]$zipfile, [string]$outpath)
[System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
}

if (Test-Path $sourceFolder ){
$Files = Get-ChildItem $sourceFolder*.* -include .zip,.out,*.err
$srcZipFile = $Files | where {($_.extension -eq “.zip”) }#Identifying zip file in the source path#

if ((Test-Path $sourceFolder*.out) -or (Test-Path $sourceFolder*.err)){
$srcOrTarget=“SRC”
Send-ToEmail -email “ccarrylab@gmail.com” $sourceFolder $srcOrTarget;
if (Test-Path $srcZipFile){
$zipFolderName = $([io.fileinfo]“$srcZipFile”).basename
Unzip “$srcZipFile” “$sourceFolder$zipFolderName”
$tempList = get-childitem “$sourceFolder$zipFolderName” -recurse
$zipFileList = $tempList | where {($.extension -eq “.err”) -or ($.extension -eq “.out”) }

	if ($zipFileList.length -gt 0 ){
	
	Remove-Item $sourceFolder\$zipFolderName -Force -Recurse
	
	}else{
	Remove-Item $sourceFolder\$zipFolderName -Force -Recurse
	
	}
}

	Copy-Item $sourceFolder $targetPath -Force -recurse
	if (Test-Path $targetPath){
		$srcOrTarget = 'TGT'
		Send-ToEmail  -email "ccarrylab@gmail.com" $targetFolder $srcOrTarget;
	}
}

}else{

Write-Host “There is no files received today yet”
}

Cohen, this appears to be the same question your asked here-
https://powershell.org/forums/topic/how-to-unzip-files-and-copy-it-to-the-target-location
Are you saying that what was provide there did not get you to your resolution?

Is it really that hard to use the code formatting tags? You would do yourself and us a favor using them. I’d be easier to read and to debug your badly formatted scripts.
If I can see right you’re trying to pipe Out-Null to New-Object. What should be the purpose of that construct?

I was able to get it fixed.

I used this script instead. It works, but the things I want to do is to only look for the latest folder. The client is sending folder in yyyymmdd Where do I need to add this to the script. I want to add a line on the only scan for the most reached created folder. It scans all the other subfolders and transfers all the files.

[CmdletBinding()]
param (
[Parameter( Mandatory=$false)]
[string]$SMTPUser=“Outbound@yahoo.com”,

    [Parameter( Mandatory=$false)]
    [string]$SourcePath="\\internal\ABC\Automation\FTPWorking\IncomingFiles\ABC",

    [Parameter( Mandatory=$false)]
    [string]$TargetPath="\\internal\ABC\DataAssets\Submissions\ABCD_RAPS\InboundClaimFlatFiles",

    [Parameter( Mandatory=$true)]
    [string[]]$SearchParameters,

    [Parameter( Mandatory=$false)]
    [string]$SMTPPass="Wonderful72017"
)

#Declaring additional variables
$EmailData = @()
$ReportEmailSubject = “Great news. You received new wonder files from ABCD.”
$SMTPPass = $SMTPPass | ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Pass

#…

Modify these Email Settings

#…

$smtpsettings = @{
To = “cohen.carryl@yahoo.com,"cohen.carryl@gmail.com","cohen.carryl@hotmail.com","cohen.carryl@msn.com"
From = “Outbound@yahoo.com
Subject = “$ReportEmailSubject - $date”
SmtpServer = “smtp.office365.com
Credential = $cred
}

Function New-ReportRequest {
[CmdletBinding()]
param(
[Parameter( Position=0,Mandatory=$true)]
[string]$Subject,

    [Parameter( Mandatory=$true)]
    [array]$Data
    )
if ($Data.count -gt '0') {
    #Generating HTML Report
    $htmlhead="
                
                BODY{font-family: Arial; font-size: 8pt;}
                H1{font-size: 18px; color: #419944}
                H2{font-size: 14px;}
                H3{font-size: 12px;}
                TABLE{border: 1px solid black; border-collapse: collapse; font-size: 8pt; margin-left: auto; margin-right: auto}
                TH{border: 1px solid black; background: #dddddd; padding: 5px; color: #000000;}
                TD{border: 1px solid black; padding: 5px; }
                
                
                $Subject
                Report Created: $now
                Total Files Moved: $($Data.count)
                "
    $htmlbody = $Data | Sort-Object UserName | ConvertTo-Html
    $htmltail = "
                    
                
            "

    $htmlreport = $htmlhead + $htmlbody + $htmltail

   
        Send-MailMessage @smtpsettings -Body $htmlreport -BodyAsHtml -Encoding ([System.Text.Encoding]::UTF8) -UseSsl
        }
    }

$allFiles = Get-ChildItem -Path $SourcePath -Recurse -Include $SearchParameters

foreach ($file in $allFiles) {
if ($file.Extension -eq “.zip”) {
Expand-Archive -Path $file.FullName -DestinationPath “$SourcePath\Temp” -Force
$subFiles = Get-ChildItem -Path “$SourcePath\Temp” -Include $SearchParameters -Recurse
foreach ($sub in $subFiles) {
Copy-Item -Path $sub.FullName -Destination $TargetPath -Force
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name “SourceFile” -Value $($sub.FullName)
$obj | Add-Member -MemberType NoteProperty -Name “TargetPath” -Value $TargetPath
$EmailData += $obj
}
} else {
Copy-Item -Path $file.FullName -Destination $TargetPath -Force
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name “SourceFile” -Value $($file.FullName)
$obj | Add-Member -MemberType NoteProperty -Name “TargetPath” -Value $TargetPath
$EmailData += $obj
}
}

New-ReportRequest -Subject $ReportEmailSubject -Data $EmailData

The script work, but it is scanning all the folder in the source path.