디자인 범위 : PowerShell 및 WinSCP .NET 어셈블리를 사용하여 파일 타임 스탬프를 사용하여 다운로드 할 파일을 식별함으로써 야간 다운로드를 자동화합니다. 연결되어있는 FTP 서버가 IIS이므로 현재 구성에서는 MLSD와 같은 모든 명령을 지원하지 않으므로 요청이있을 경우 변경하지 않습니다.
문제 : 한 달 또는 두 자리 월이있는 파일은 다른 문자열 길이를 반환합니다.이 문제를 해결하는 방법은 확실하지 않습니다. 내 코드는 이제 작동하지만 10 월에 작동을 멈 춥니 다.
예 : March은 03 / dd / yyyy 대신 3 / dd / yyyy를 표시합니다.
기타 참고 사항 : 처음에는 WinSCP.com을 사용하여 스크립팅을 시도했지만 날짜를 올바르게 지정하는 방법을 찾지 못했습니다.
예를 들어, 당신은 지정할 수 있습니다 *.zip>=1D
또는 *.zip<=1D
, 그러나 *.zip=1D
나*.zip==1D
현재 WinSCP에의 최신 릴리스에서 지원되지 않습니다.
암호:
$yesterday = [DateTime]::Today.AddDays(-1).ToString("M/dd/yyyy")
# OR I have to use ToString("MM/dd/yyyy") for months 10-12,
# but I need both formats to work.
#delete the temporary file
del .\FTPfiles.txt
# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Ftp
HostName = "server.com"
UserName = "joe"
Password = "smith"
}
$session = New-Object WinSCP.Session
try
{
# Connect
$session.Open($sessionOptions)
$directory = $session.ListDirectory("/Folder")
foreach ($fileInfo in $directory.Files)
{
Write-Output ("{1} {0}" -f
$fileInfo.Name, $fileInfo.LastWriteTime) >> FTPfiles.txt
}
$fileList = get-content .\FTPfiles.txt | findstr $yesterday
$stripped = $fileList -creplace '^.*Z12', 'Z12'
# Download files
$remotePath = "/Folder/"
$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.TransferMode = [WinSCP.TransferMode]::Binary
$lines = $stripped
foreach ($line in $lines)
{
Write-Host ("Downloading {0} ..." -f $line)
$session.GetFiles($remotePath+$line, "C:\Downloads\").Check()
}
}
catch [Exception]
{
Write-Host ("Error: {0}" -f $_.Exception.Message)
exit 1
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
$fileInfo in $directory.Files
쓰기는 마지막으로 쓴 시간과은으로 파일 이름을 FTPfiles.txt
지정한 폴더에서 FTP 서버에 포함 된 모든 파일에 대해. 이 텍스트 파일을 읽은 다음 어제 날짜에 발생한 쓰기 시간이있는 파일로 추가로 축소 한 다음 2 자리 대신 월에 1 자리를 사용하는 날짜 형식으로 인해 현재 9 개월 밖에 작동하지 않습니다 .
그 다음 파일은 파일 이름 앞의 날짜를 읽은 후 제거하여 파일 이름을 사용하여 다운로드를 반복합니다. 변환은 다음과 같습니다.
FROM:
3/14/2017 2:04:00 AM Z1234_20170314050001_1.zip
3/14/2017 3:04:00 AM Z1234_20170315060002_1.zip
3/14/2017 4:04:00 AM Z1234_20170316070001_1.zip
3/14/2017 5:04:00 AM Z1234_20170317080001_1.zip
TO:
Z1234_20170314050001_1.zip
Z1234_20170315060002_1.zip
Z1234_20170316070001_1.zip
Z1234_20170317080001_1.zip
그런 다음 스크립트는 그 파일 이름을 사용하여 전날의 필요한 파일을 다운로드합니다.
[DateTime]::Today.AddDays(-120).ToString("M/dd/yyyy")
반환 (CCA 사개월 전에 날짜) 11/15/2016
와 두 자리 개월. BTW, 임시 파일을 만들고 외부 findstr.exe
도구를 사용할 필요가 없습니다 . 당신은 $fileInfo.LastWriteTime
적절한 정규식과 -match
연산자를 사용하여 PowerShell에서 직접 확인할 수 ...
[datetime]::Now.AddDays(200).ToString("M/dd/yyyy")
(현재 10 월에 넣습니다. 항상 2 자리 숫자를 얻기 위해 문자열 형식 MM을 사용하십시오.
[DateTime]::Today.AddDays(-1).ToString("M/dd/yyyy")
은 10 월에 두 자릿수 달로 확장 될 것이고, 하나의 M은 단지 선행 0을 의미하지 않는다.