@REM Tokenize current date.@for/f"tokens=1,2,3,4 delims=/ "%%a in('date/t')do@setx=%%d
@for/f"tokens=1,2,3,4 delims=/ "%%a in('date/t')do@setm=%%b
@for/f"tokens=1,2,3,4 delims=/ "%%a in('date/t')do@setd=%%c
@REM run today if no date passed@if"%3"==""(@setyyyymmdd=%x%%m%%d%)else(@setyyyymmdd=%3)@ECHO Running %0@REM @ECHO For %YYYYMMDD%@SETproject=%1@SETaction=%2@call%~dp0\config.bat
@ECHO calling %scriptpath%%project%%action%%csvpath%@powershell -NoProfile -ExecutionPolicy Bypass %scriptpath%%csvpath%%project%%action%
param($csvconfig,$project,$action)functionGet-ScriptFull{Split-Path$script:MyInvocation.MyCommand.Definition$MyInvocation.ScriptName.Replace((Split-Path$MyInvocation.ScriptName),'').TrimStart('')}$scriptrunning=Get-ScriptFullwrite-host"running $scriptrunning"# path to your config# $csvconfig = 'clone.csv'$csvdata=Import-Csv$csvconfig$isodate=get-date-Formatyyyy-MM-dd$yymmdd=get-date-FormatyyMMdd# custom wildcards use yymmdd for today 170504functionupdate-set($csvdata){foreach($_in$csvdata){$_.path=$_.path.Replace('yymmdd',$yymmdd)$_.destination=$_.destination.Replace('yymmdd',$yymmdd)$_.path=$_.path.Replace('yyyy-MM-dd',$isodate)$_.destination=$_.destination.Replace('yyyy-MM-dd',$isodate)$_.path=$_.path.Replace('yesterday',$yesterday)$_.destination=$_.destination.Replace('yesterday',$yesterday)}return$csvdata}update-set($csvdata)--quiet--no-verbose|out-null# loggingfunctionGet-ScriptDirectory{Split-Path$script:MyInvocation.MyCommand.Definition}$mypath=Get-ScriptDirectorywrite-host"running $mypath using $csvconfig"# ftp get and putfunctiongettask($task){Set-LocationC:\winscpAdd-Type-Path"WinSCPnet.dll"# Set up session options$sessionOptions=New-ObjectWinSCP.SessionOptions-Property@{Protocol=[WinSCP.Protocol]::SftpHostName="sftp.your.com"UserName="something"Password="secrets"SshHostKeyFingerprint="ssh-rsa 2048 e2:...:8a"}$session=New-ObjectWinSCP.Sessiontry{# Connect$session.Open($sessionOptions)# Upload files$transferOptions=New-ObjectWinSCP.TransferOptions$transferOptions.TransferMode=[WinSCP.TransferMode]::Binary$transferResult=$session.GetFiles($task.destination,$task.path,$False,$transferOptions)# Throw on any error$transferResult.Check()# Print resultsforeach($transferin$transferResult.Transfers){Write-Host("Download of {0} succeeded"-f$transfer.FileName)}}finally{$session.Dispose()}if($task.continue-eq'y'){subchain$task}}# end gettask# putfunctionputtask($task){Set-LocationC:\winscpAdd-Type-Path"WinSCPnet.dll"# Set up session options$sessionOptions=New-ObjectWinSCP.SessionOptions-Property@{Protocol=[WinSCP.Protocol]::SftpHostName="sftp.some.com"UserName="someuser"Password="pwdsecretomg"SshHostKeyFingerprint="ssh-rsa 2048 0d:...8a"}$session=New-ObjectWinSCP.Sessiontry{# Connect$session.Open($sessionOptions)# Upload files$transferOptions=New-ObjectWinSCP.TransferOptions$transferOptions.TransferMode=[WinSCP.TransferMode]::Binary$transferResult=$session.PutFiles($task.path,$task.destination)# Throw on any error$transferResult.Check()# Print resultsforeach($transferin$transferResult.Transfers){Write-Host("Upload of {0} succeeded"-f$transfer.FileName)}}finally{$session.Dispose()}if($task.continue-eq'y'){subchain$task}}# end puttaskfunctionmovetask($task){move-item$task.path$task.destination-Forceif($task.continue-eq'y'){subchain$task}}functioncopytask($task){copy-item$task.path$task.destination-Forceif($task.continue-eq'y'){subchain$task}}functionrenametask($task){rename-item-path$task.path-newname$task.destination-Forceif($task.continue-eq'y'){subchain$task}}functionnewtask($task){if(-not(test-path($task.path))){new-item-path$task.path-ItemType$task.type }else{write-host"$($task.path) already exists"}# add test with email alert option to destination if this fails?if($task.continue-eq'y'){subchain$task}}functionremovetask($task){if($task.type ='recursive'){remove-item-path$task.path-Recurse}else{remove-item-path$task.path}if($task.continue-eq'y'){subchain$task}}functioninvoketask($task){invoke-item-path$task.pathif($task.continue-eq'y'){subchain$task}}functioncleartask($task){clear-content$task.pathif($task.continue-eq'y'){subchain$task}}functionaddtask($task){$task.destination|add-content$task.pathif($task.continue-eq'y'){subchain$task}}functioncmdtask($task){&$task.pathif($task.continue-eq'y'){subchain$task}}functionurltask($task){Start-Process"chrome.exe"$task.pathif($task.continue-eq'y'){subchain$task}}functiontesttask($task){Test-Path($task.path)if(-not(test-path($task.path))){&dna$($task.destination)email&dna$task.destinationemail}if($task.continue-eq'y'){subchain$task}}functionreadtask($task){Get-Content$($task.path)if($task.continue-eq'y'){subchain$task}}functionlisttask($task){Get-ChildItem$task.path-rif($task.continue-eq'y'){subchain$task}}functionscrapetask($task){Invoke-WebRequest$task.pathif($task.continue-eq'y'){subchain$task}}functionservicetasktask($task){get-service-ComputerName$task.pathif($task.continue-eq'y'){subchain$task}}functionatomtask($task){atom-n-a$task.pathif($task.continue-eq'y'){subchain$task}}functioncliptask($task){$task.path|clipif($task.continue-eq'y'){subchain$task}}functionfindtask($task){get-childitem-path$task.path-r|Select-String-pattern$task.destination|ForEach-Object{write-host"match in $task.path"}if($task.continue-eq'y'){subchain$task}}functionfilebackuptask($task){$newfile="$($task.path)"+"."+"$isodate"copy-item-path$($task.path)-Destination$newfile-Forceif($task.continue-eq'y'){subchain$task}}functionownertask($task){get-acl-Path$($task.path)if($task.continue-eq'y'){subchain$task}}functionzipfoldertask($task){&"C:\Program Files\7-Zip\7z.exe"a-mx=9$($task.destination)$($task.path)if($task.continue-eq'y'){subchain$task}}functionemailtask($task){$param=@{SmtpServer='1.0.0.1'From='SUPPORT@your.com'To=$task.destinationSubject=$task.pathBody="<html><body>$($task.type)<br></body></html>"BodyAsHtml=$true}Send-MailMessage@paramif($task.continue-eq'y'){subchain$task}}functionremovelinetask($task){$match=$task.type$clean=Get-Content$task.path|Where-Object{$_-notmatch$match}new-item$task.destination-ItemTypefileClear-Content$task.destination$clean|Out-File$task.destinationif($task.continue-eq'y'){subchain$task}}functionreplacelinetask($task){(Get-Content$task.path)|Foreach-Object{$_-replace$task.destination,$task.type}|Out-File$task.pathif($task.continue-eq'y'){subchain$task}}functionexpressionset($task){Invoke-Expression"& $($task.path)"if($task.continue-eq'y'){subchain$task}}# these are logic for running a whole project or just one type of action for one projectfunctionsubchain($task){&dna$task.subproject$task.subaction}functionrunone($action,$task){switch($action){get{gettask$task}put{puttask$task}move {movetask$task}copy {copytask$task}clip{cliptask$task}rename{renametask$task}new{newtask$task}remove{removetask$task}invoke{invoketask$task}clear {cleartask$task}add{addtask$task}cmd{cmdtask$task}url{urltask$task}test{testtask$task}list{listtask$task}read{readtask$task}scrape{scrapetask$task}service{servicetask$task}atom{atomtask$task}find{findtask$task}filebackup{filebackuptask$task}zip{zipfoldertask$task}owner{ownertask$task}email{emailtask$task}removeline{removelinetask$task}replacestring{replacelinetask$task}iexp{expressionset$task}default{"missing parameters"}}}functionrunproject{$projectset=$csvdata|Where-Object{$_.project-eq$project}foreach($_in$projectset){$action=$_.actionrunone-action$action-task$_start-sleep-s.5}}functionfilteroneaction($action){$taskset=$csvdata|Where-Object{$_.project-eq$project-and$_.action-eq$action}foreach($_in$taskset){runone-action$_.action-task$_}}if($action-eq$null){write-host"no action passed running all actions on project $project"runproject}elseif($action-ne$null){write-host"running only task type $action on project $project"filteroneaction$action}