
저는 PowerShell 스크립트에 대해 조금 배우고 이 코드 조각이 포함된 스크립트를 논리적으로 분석하려고 노력하고 있습니다.
$destFolders | Foreach-Object { Copy-Item -Path $Source -dest (Join-Path $_ $destFileName) }
내가 이 글을 처음부터 썼다면 다음과 같이 쓸 것 같습니다. 왜 제가 틀렸나요?
$destFolders | Foreach-Object { Copy-Item -Path $Source -dest ($_) }
전체 스크립트: - $destfilename이 정의되지 않았습니다. 오류(?)가 있을 수 있습니다.
$path = "C:\a\"
$filename = (get-date).AddDays(-4).ToString('afileMMdd.txt')
$fileexisting = "$path\$filename"
$destfolders = "C:\b\", "C:\c\"
while(!(Test-Path $fileexisting)) {Start-Sleep 5}
$destfolders |
ForEach-Object {Copy-Item -Path $path\$filename -dest (Join-Path $_ $destfilename)}
답변1
이 줄에는 전체 스크립트의 일부인 것처럼 보이는 $destFolders
, $Source
및 와 같은 요소가 포함되어 있습니다. $destFileName
그것들과 그 목적을 알지 못하면 내 대답이 틀릴 수도 있습니다.
그러나, 그복사항목명령에는 항목을 복사하고 이름을 바꾸는 기능도 있습니다. 이것이 바로 스크립트의 첫 번째 줄이 수행하는 작업인 것 같습니다. 귀하의 라인은 항목을 복사합니다.
답변2
간단히: 디렉토리 및 파일 정보가 포함 Join-Path
된 폴더 구조를 유지할 수 있습니다 . (즉 , , 아닌 $destFileName
것처럼 보입니다 )"somedirectory\myfile.txt"
myfile.txt
따라서 스크립트는 C:\
드라이브 에서 E:\
및 으로 파일을 복사합니다 D:\
.
파일이 C:\myfile.txt
존재한다고 상상해보십시오.
두 스니펫을 모두 사용하여 복사하면 동일한 결과가 나옵니다. 스니펫에는 "c:\에서 d:\ 및 e:\로 복사합니다. 파일 이름에 대해서는 아무 작업도 수행하지 않으므로 동일하게 유지하세요"라고 말하고, 다른 스니펫에서는 "다음에서 복사"라고 말합니다. c:\에서 d:\myfile.txt 및 e:\myfile.txt로 파일 이름을 명시적으로 알려드립니다."
파일이 있다고 상상해보십시오.C:\somedirectory\myfile.txt
$_
이제 복사할 때D:\myfile.txt
와 다시 복사할 때 차이가 있습니다E:\myfile.txt
. 파일이 디렉토리 내에 포함되어 있다는 사실을 무시합니다. 을 사용하면Join-path $_ $destFileName
파일이 D:\somedirectory\myfile.txt에 복사된다는 의미입니다.and E:\somedirectory\myfile.txt
답변3
이중 백슬래시 C:\a\\a6ile0309.PxP
(사소한 실수)와 원래 출력에서 원치 않는 문자(심각한 오류)를 볼 수 있습니다.
a6ile0309.PxP
↑ ↑ ↑
↓ ↓ ↓
afile0309.txt
후자는 형식 지정자를 잘못 사용하여 발생 f
하며t
(get-date).AddDays(-4).ToString('afileMMdd.txt')
# ↑ ↑ ↑
읽다날짜 및 시간 형식 지정그리고CultureInfo 개체를 사용하여 숫자 및 날짜 형식 지정:
f
전체 날짜 및 시간(긴 날짜 및 짧은 시간)t
,%t
AM/PM 지정자의 첫 번째 문자AMDesignator 또는 PMDesignator(있는 경우)에 정의됩니다. 형식 패턴이 다른 형식 패턴과 결합되지 않은 경우 "%t"를 지정합니다.
실제로 지난 밀리초(?) 또는 틱(?)까지의 결과 f
는 아래 마지막 참고 사항을 참조하세요. afile
솔직히 이스케이프가 가능한지 잘 모르겠습니다. 다음 코드 조각을 시도해 보세요.
'--- original ---'
$path = "C:\a\"
$filename = (get-date).AddDays(-4).ToString('afileMMdd.txt')
$fileexisting = "$path\$filename"
$destfolders = "C:\b\", "C:\c\"
Write-host $filename, $fileexisting -ForegroundColor Yellow
### next WHILE never ends
### while(!(Test-Path $fileexisting)) {Start-Sleep 5}
'--- use rather ---'
$path = "C:\a\"
$filename = 'afile' + (get-date).AddDays(-4).ToString('MMdd') + '.txt'
$fileexisting = Join-Path $path $filename
$destfolders = "C:\b\", "C:\c\"
Write-host $filename, $fileexisting
산출:
PS D:\PShell> D:\PShell\SU\1187865.ps1
--- original ---
a6ile0309.PxP C:\a\\a6ile0309.PxP
--- use rather ---
afile0309.txt C:\a\afile0309.txt
참고하세요저것
$filename = 'afile' + (get-date).AddDays(-4).ToString('MMdd') + '.txt'
다음과 같이 쓸 수 있다
$filename = '{0}{1}{2}' -f 'afile' , (get-date).AddDays(-4).ToString('MMdd') , '.txt'
그리고 어떤 표기법이 더 좋고 더 정확한지는 모르겠습니다(PowerShellish).
또한 참고차이점:
PS D:\PShell> (get-date).ToString("yyyy-MM-dd-HH.mm.ss.ffffff") # six f
2017-03-13-22.23.35.897305
PS D:\PShell> (get-date).ToString("yyyy-MM-dd-HH.mm.ss.fffffff") # seven f
2017-03-13-22.30.08.4030682
PS D:\PShell> (get-date).ToString("f")
13 March 2017 22:23
PS D:\PShell> (get-date).ToString("ff")
20