기본 Powershell 스크립트

기본 Powershell 스크립트

저는 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

관련 정보