2009-10-04 8 views
3

나는 powershell newbie입니다. 샘플 스크립트를 사용하고 첫 번째 줄에서 get-item 대신 get-content를 사용했습니다. 스크립트를 실행할 때 오류가보고되지 않고, 처리하는파일 목록의 읽기 속성을 변경하는 방법은 무엇입니까?

\\testserver\testshare\doc1.doc 
\\testserver2\testshare2\doc2.doc 

는 본질적으로 그래서
$file = get-content "c:\temp\test.txt" 
if ($file.IsReadOnly -eq $true) 
{ 
$file.IsReadOnly = $false 
} 

내가 UNC 경로로 저장 TEST.TXT에 포함 된 작업 항목에 노력하고 아래처럼 수정 된 스크립트가 보인다 첫 번째 입력시에도 수행됩니다.

답변

8

짧은 답변 :

sp (gc test.txt) IsReadOnly $false 

긴 대답


아래 글쎄, 몇 가지이 문제입니다.

$file은 실제로 파일의 행을 포함하는 string[]입니다. 따라서 IsReadOnly 속성은 string[]에 적용되며 파일 이름 일 수있는 실제 문자열이 아닌 실제 문자열에 적용됩니다.

그래서 내가 올바르게 이해하고 있으면 각 파일에 다른 파일 이름이 들어있는 파일을 읽으려고합니다. 그리고 해당 파일에 대한 읽기 전용 특성을 지 웁니다.

Get-Content으로 시작하는 것은 여기에 잘못이 아닙니다. 우리는 확실히 그것을 필요로 할 것입니다 :

$filenames = Get-Content test.txt 

이제 우리는 파일 이름 목록을 가지고 있습니다. 파일의 속성에 액세스하려면 해당 파일 이름을 실제 FileInfo 객체로 변환하고 조작해야합니다. 또는 파일 이름을 -Path 인수로 Set-ItemProperty으로 전달합니다.

먼저 첫 번째 방법을 택한 다음 다른 방법으로 이동합니다. 그래서 우리는 많은 파일 이름을 가지며 그들로부터 FileInfo 개의 객체를 원합니다.

$files = (foreach ($name in $filenames) { Get-Item $name }) 

그런 다음 파일 이름 전체를 반복하고 그들 각각에 IsReadOnly 속성을 설정할 수 있습니다 :이은 (우리가 목록에있는 모든 파일에 대해이 작업을 수행 할 필요가 있기 때문에)를 foreach 루프를 수행 할 수 있습니다

foreach ($file in $files) { 
    $file.IsReadOnly = $false 
} 

길고 귀찮은 변형입니다. PowerShell에 대한 사전 경험이없는 사람들에게 가장 적합한 도구 일 것입니다. 파이프 라인을 사용하면 여러 컬렉션이 누락 될 필요가 줄어 듭니다. 파이프 라인은 개체를 하나의 cmdlet에서 다른 cmdlet으로 전송하며 해당 개체에는 여전히 형식이 있습니다.

그래서 우리는 정확히 같은 결과를 달성하고

Get-Content test.txt | Get-Item | ForEach-Object { $_.IsReadOnly = $false } 

을 작성하여. 우리는 파일의 내용을 읽어 들여 string의 묶음을 얻습니다. 그것들은 Get-Item으로 전달되며, 파이프 라인 입력으로 무엇을해야하는지 알게됩니다.이 객체는 파일 경로로 처리됩니다. 우리가 여기서 필요한 것.그런 다음 Get-ItemFileInfo 개체를 파이프 라인에서 더 내려 보내며이 지점에서 우리는 루프를 끝내고 읽기 전용 속성을 false으로 설정합니다.

이제는 더 짧았고, 약간의 연습을 거쳐 더 쉬웠습니다. 그러나 그것은 여전히 ​​이상에서 멀어졌습니다. 이전에 말한 것처럼 Set-ItemProperty을 사용하여 파일의 읽기 전용 속성을 설정할 수 있습니다. Set-ItemProperty-Path 매개 변수의 입력으로 문자열 배열을 취할 수 있다는 장점을 활용할 수 있습니다. Set-ItemProperty 직접 -Path에 대한 값으로 입력 문자열을 허용하지 않습니다 때문에

$files = Get-Content test.txt 
Set-ItemProperty -Path $files -Name IsReadOnly -Value $false 

우리는 여기에 임시 변수를 사용하고 있습니다. 그러나 우리는이 임시 변수를 인라인 할 수 있습니다 다음 Get-Content 호출 주위

Set-ItemProperty -Path (Get-Content test.txt) -Name IsReadOnly -Value $false 

괄호는이 단일 인수하고 먼저 평가해야한다는 PowerShell을 말할 필요하다.

우리는 다음 이러한 매개 변수의 각 Set-ItemProperty가 될 것으로 예상 위치에 사용된다는 사실을 이용할 수 있습니다, 그래서 우리는 단지 값으로 매개 변수 이름을 생략하고 충실 할 수

Set-ItemProperty (Get-Content test.txt) IsReadOnly $false 

그리고 우리는 그들의 기본 별칭에 cmdlet 이름 줄일 수 있습니다 : 0가로 변환되기 때문에 우리는 실제로 더 많은 공간을 절약하기 위해 0$false를 작성할 수

sp (gc test.txt) IsReadOnly $false 

을 부울 값으로 사용되는 경우. 그러나 나는 여기서 단축하는 것으로 충분하다고 생각한다.

2

요하네스는 실행중인 문제의 배경에 대한 이론을 가지고 있습니다.

Get-Content "c:\temp\test.txt" | Set-Writable 

또는 짧은 별칭 형식 : 난 그냥 당신이를 사용하는 일이 있다면 예를 들어 알고 파이프 라인되는 PowerShell Community Extensions 당신이 설정 기록 가능 및 Set-읽기 전용 명령을 사용하여이 작업을 수행 할 수 있음을 지적하고 싶었 :

gc "c:\temp\test.txt" | swr 

Set-ReadOnly의 별명은 sro입니다. 나는 매일이 명령을 매주 사용합니다.

+0

아, 좋습니다. PSCX를 더 깊이 조사해야 할 것 같습니다. Curently 나는 그들을 Out-Clipboard를 위해 직장에 설치했을뿐입니다. – Joey

관련 문제