Functions of Files

#pathMe
$pathMe = $pwd

#Constant
$pathTop = [Environment]::GetFolderPath('Desktop')

#Functions

#strings
function MySubstring{
    param(
        [string]$strIn,
        [int]$nSta=0,$nCnt=$null)

    if($nSta -gt $strIn.length){
        $strOut = ''
    }else{
        if($nCnt -eq $null){ $nCnt = $strIn.length }
        else{ [int]$nCnt=[int]$nCnt } 

        if($nCnt -le 0){ return ""}
        if(($nSta + $nCnt) -gt $strIn.length){
            $strOut = $strIn.Substring($nSta,($strIn.length - $nSta))
        }else{
            $strOut=$strIn.Substring($nSta,$nCnt)
        }
    }
    return $strOut
}

function MyCharUp{
    param(
        $CharIn,
        [int]$nUp=1
    )
    $buf=[byte][char]$CharIn 
    return [char]($buf+$nUp)   
}

#Number and Time
function IsDateTime($var){
    try{
        $huga = [datetime]$var
    }
    catch{
        return $false
    }
    return $true
}
function MyRound([double]$num, [int]$numDigits){
# 第二引数に切り捨てを行う桁数を指定。少数はマイナス(-)で指定できる
# 省略すれば、整数にする。
    $m = [Math]::Pow(10,(- $numDigits));
    return [Math]::Round($num * $m, [MidpointRounding]::AwayFromZero) / $m;
}

#Paths
function MyTestPath([string]$path,[string]$name){
    if([bool]$name){
        return (Test-Path ".\$name")
    }

    if([bool]$path){
        return Test-Path $path
    }else{
        return $false
    }
}
function MySplitPathDrive($path){
    try{
        $sDrv = Split-Path $path -Qualifier
    }
    catch{
        $sDrv =''
    }
    return $sDrv
}
function CorrectName($name){
    $name.Replace('\','').Replace(':','')
}
function MySplitName([string]$pathOrName){
    $nmOut = Split-Path $pathOrName -Leaf
    $nmOut = $nmOut -replace "\..*" , ""
    return $nmOut
}

function GetDrivePaths{
    $Drives = Get-PSDrive | where {  ([string]$_.Name).Length -eq 1}
    [string[]]$DrivePaths = @()
    foreach($el in $Drives){
        $DrivePaths += ( $el.name + ":" )
    }
    return $DrivePaths

}

#Files Edit
function ExitByCurDrive{
    try{
        $sDrv = Split-Path (Convert-Path .) -Qualifier
    }
    catch{
        $sDrv =''
    }
    if($sDrv -ne 'C:'){
        Write-Host 'C:ドライブでないためExit'
        exit
    } 
}
function ExitByPasteDrive($pathPaste){
    try{
        $sDrv = Split-Path $pathPaste -Qualifier
    }
    catch{
        $sDrv =''
    }
    if($sDrv -ne 'C:'){
        Write-Host 'C:ドライブでないためExit'
        exit
    } 
}

function CdMyData{
    $pathData= "$pathMe\Data" 
    if(Test-Path $pathData){
        cd $pathData
    }else{
        cd $pathMe
        New-Item 'Data' -itemType Directory
        cd $pathData
    }
}

function MyRename{
    param(
        [string]$nmMoto,[string]$nmNew,
        [switch]$RemoveByDate
        )
    ExitByCurDrive
    if( (Test-Path ".\$nmMoto") -eq $False ){
        return ('Error - not found '+ $nmMoto)
    }
    if($nmMoto -eq $nmNew){
        return
    }
    if(Test-Path ".\$nmNew"){ #Rename先有りの時
        if($RemoveByDate){
            $tNew=(Get-ItemProperty $nmNew).LastWriteTime
            $tMoto=(Get-ItemProperty $nmMoto).LastWriteTime
            if($tNew -gt $tMoto){
                MyRemove $nmMoto
            }else{
                MyRemove $nmNew
            }
        }
    }
    Rename-Item $nmMoto -newName $nmNew
    return "Exec - $nmMoto to $nmNew"        
}

function MyRemove($nmRm,[switch]$Force){
    ExitByCurDrive
    if( (Test-Path ".\$nmRm") -eq $True ){
        $Error.Clear()
        $ErrorActionPreference = "SilentlyContinue"
        if($Force){ Remove-Item $nmRm -Force }
        else{ Remove-Item $nmRm }
        $ErrorActionPreference = "Continue"
        if([bool]$Error){
            return "Error: Fail to Remove $nmRm.`r`n--$Error[0]"
        }else{ return "Exec: $nmRm Removed." }
    }else{ 
        return "Error: Not found $nmRm ."
    }
}

function MyCopy($nmCopy,$pathPaste,[switch]$force){
    ExitByPasteDrive $pathPaste
    if( (Test-Path ".\$nmCopy") -eq $False ){
        return ("Error: Not found $nmCopy .")
    }
    if( (Convert-Path .) -eq $pathPaste){
        return ("Error: $pathPaste is current." )
    }

    if($force){ Copy-Item $nmCopy $pathPaste -Force }
    else{
        if(Test-Path "$pathPaste\$nmCopy"){
            return ("Error: $pathPaste Already exists in $pathPaste ." )
        }
        Copy-Item $nmCopy $pathPaste
    }
    return "Exec: $nmCopy Copyto "+(Split-Path $pathPaste -Leaf)+" ."
}
function MyCopyInCurDir($nmCopy,$nmPaste){
    #ExitByPasteDrive $pathPaste
    if( (Test-Path ".\$nmCopy") -eq $False ){
        return ('Error - not found '+ $nmCopy)
    }
    $fullPaste = (Convert-Path .) + "\$nmPaste"
    if(Test-Path $fullPaste){
        return ("Error - $nmPaste is exists" )
    }

    Copy-Item $nmCopy $nmPaste
    return "Exec - $nmCopy Copy-to "+$nmPaste
}

function MakeShortcut($nmTarget,$pathPaste){    
    if( (Test-Path ".\$nmTarget") -eq $False ){
        return ('Error - not found '+ $nmTarget)
    }
    if( (Test-Path $pathPaste) -eq $False ){
        return ('Error - not found '+ $pathPaste)
    }
    ExitByPasteDrive $pathPaste

    $FullTarget = Convert-Path $nmTarget
    $FullLinkFile = "$pathPaste\$nmTarget - Link.lnk"
    $WshShell = New-Object -ComObject WScript.Shell
    $ShortCut = $WshShell.CreateShortcut($FullLinkFile)
    $ShortCut.TargetPath = $FullTarget
    $ShortCut.Save()
    $WshShell = $null

    return "Exec - "+(Split-Path $FullLinkFile -Leaf)+ `
            " Created in "+(Split-Path $pathPaste -Leaf)
}

function WriteLog{
    param(
        $strWrite,
        $pathWrite=""        
        )

    $pathThis = $pwd
    if( MyTestPath $pathWrite ){ cd $pathWrite }

    ExitByCurDrive
    $nmLogMoto = Get-ChildItem | where {$_.name -like '*.log'} | `
            sort -Property LastWriteTime -Descending | select -First 1
   
    $nmLogNew = (Get-Date -Format "yyMMdd") + '.log'

    if([bool]$nmLogMoto -eq $false){
        [void](New-Item $nmLogNew)
    }else{
        [void](MyRename $nmLogMoto $nmLogNew)
    }

    "$strWrite" | Out-File -Append -FilePath $nmLogNew
    Write-Host $strWrite
    cd $pathThis
}
function ReadLog{
    param(
        [string]$path = ".",
        [switch]$ReadLastDate        
        )    
    #get log-file-name
    $nmLog = Get-ChildItem $path -Name | where {$_ -like "*.log"}|sort -Descending |select -First 1
    #get file-content
    if([bool]$nmLog){
        $fullLog = [string](Join-Path $path $nmLog)    
        $objCont = Get-Content $fullLog
    }else{ $objCont = $null }

    # read
    if($ReadLastDate){
        if($objCont -eq $null){
            return [datetime]"1900/01/01"
        }
        for($i = $objCont.Length; $i -ge 0; $i--) {
            if(IsDateTime $objCont[$i]){
                return [datetime]$objCont[$i]
                break
            }
        }

        return [datetime]"1900/01/01"
    }
}


function UpdateCopy($pathPaste){
    # .logファイルのLastDateより新しいならCopy

    ExitByPasteDrive $pathPaste

    $dateLast = ReadLog $pathPaste -ReadLastDate
    $CI = Get-ChildItem . | select Name,LastWriteTime | sort {$_.LastWriteTime} -Descending
    WriteLog "Start UpdateCopy." $pathPaste

    $nmsExec =@()
    foreach($el in $CI){
        if($el.LastWriteTime -gt $dateLast){
            if($el.name -notlike '*.log'){
                $nmsExec += $el.Name
            }
        }else{
            break
        }
    }

    if($nmsExec.Length -gt 0){
        $nmsExec=$nmsExec | sort 
        foreach($nm in $nmsExec){
            $ret = MyCopy $nm $pathPaste
            if($ret -like "Exec*"){
                WriteLog ($nm +" UpdateCopy") $pathPaste
            }
        }    
    }

    cd $pathPaste
    WriteLog ("Exec UpdateCopy.`r`n" + [String](Get-Date) + "`r`n")
}

###################################