특정 파일/파일 이름을 찾기 위한 파워셸 스크립트?
파일 이름 안에 있는 문자열이 아니라 정확한 파일 이름을 검색하는 작은 스크립트를 작성하고 싶었습니다.
예를 들어 탐색기를 사용하여 'hosts'를 검색하면 기본적으로 여러 개의 결과가 나타납니다.스크립트와 함께 제가 지정한 이름만 원합니다.가능하다고 가정하고 있습니다.
대본을 시작한 지 얼마 안 됐는데 개인적인 용도로만 쓰는 거라 중요한 게 아니라 그냥 귀찮아요.저는 여러 개의 드라이브를 가지고 있어서 드라이브 문자를 쿼리하고 파일 이름을 지정하는 두 개의 입력으로 시작했습니다.확장자, 파일 크기 등으로 검색할 수는 있지만 정확한 이름으로 검색할 수는 없는 것 같습니다.
어떤 도움이라도 주시면 감사하겠습니다!
편집 : 모든 응답에 감사드립니다.그냥 최신 정보로.제 작은 대본에 답을 하나 더 넣었는데 잘 되네요.세 개의 반응 모두 효과가 있었지만 저는 궁극적으로 한 개만 사용할 수 있었고, 다른 두 개에게는 불쾌감을 주지 않았습니다.건배.명확히 하자면, 'npp'는 메모장++에 있는 별칭으로 일단 파일이 발견되면 파일을 여는 것입니다.
$drv = read-host "Choose drive"
$fname = read-host "File name"
$req = dir -Path $drv -r | Where-Object { !$PsIsContainer -and [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -eq $fname }
set-location $req.directory
npp $req
powershell 프롬프트에서 cmdlet(에일리어스: ) 및 옵션을 사용합니다.
gci -recurse -filter "hosts"
하면 이름에 하는 "하게 "가 됩니다.hosts
".
Steve Mustafa는 현재 버전의 파워셸에서는 스위치를 사용하여 다음과 같은 이름의 파일만 재귀적으로 검색할 수 있다고 지적합니다.hosts
엔티티는 (나 는 는 ):
gci -recurse -filter "hosts" -File
는 "는 " " " " " " 를 " 할 " " " " " " " " " " " " " " " " " " " " " " " " " " " "Access to the path 'C:\Windows\Prefetch' is denied.
".
오류 메시지를 방지하려면 를 무음으로 설정합니다.
gci -recurse -filter "hosts" -File -ErrorAction SilentlyContinue
추가적인 도움말은 에서 검색할 루트를 설정할 수 있다는 것입니다.예를 들어, C 드라이브의 루트에서 명시적으로 검색하는 결과 명령어는
gci -Recurse -Filter "hosts" -File -ErrorAction SilentlyContinue -Path "C:\"
만약 당신이 당신을 가지고 있다고 가정한다면.Z:
매핑된 드라이브:
Get-ChildItem -Path "Z:" -Recurse | Where-Object { !$PsIsContainer -and [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -eq "hosts" }
저는 이런 종류의 일에 이 양식을 사용합니다.
gci . hosts -r | ? {!$_.PSIsContainer}
.
매개변수에 치에핑핑에Path
매개변수치에환 다"에 매핑됩니다.Filter
. 사용을 적극 권장합니다.Filter
에 걸쳐서Include
공급자가 필터링을 지원하는 경우(파일 시스템 공급자는 지원).그것은 그것보다 훨씬 빠릅니다.Include
.
저는 @Murph 답변을 기반으로 이 기능을 사용하고 있습니다.현재 디렉터리 내부를 검색하고 전체 경로를 나열합니다.
function findit
{
$filename = $args[0];
gci -recurse -filter "*${filename}*" -file -ErrorAction SilentlyContinue | foreach-object {
$place_path = $_.directory
echo "${place_path}\${_}"
}
}
사용 예시:findit myfile
전체 컴퓨터를 검색하려면:
gdr -PSProvider 'FileSystem' | %{ ls -r $_.root} 2>$null | where { $_.name -eq "httpd.exe" }
findFileByFilename.ps1 다음과 같은 기능이 있습니다.
# https://stackoverflow.com/questions/3428044/powershell-script-to-locate-specific-file-file-name
$filename = Read-Host 'What is the filename to find?'
gci . -recurse -filter $filename -file -ErrorAction SilentlyContinue
# tested works from pwd recursively.
이 방법은 저에게 아주 효과적입니다.난 그걸 이해한다.
제 경로에 있는 폴더에 넣었습니다.
다음과 같이 호출합니다.
> findFileByFilename.ps1
전체 컴퓨터를 검색하려면:
gdr -PS 제공자 '파일 시스템' | %{ls -r $.root} 2> $null | 여기서 {$.name -eq "httpd.exe" }
여러 가지 이유로 훨씬 덜 효율적인 명령이라고 확신합니다. 하지만 가장 간단한 것은 -filter "httpd.exe"를 사용하고 많은 사이클을 절약할 수 있을 때 where-object 명령에 모든 것을 파이핑하는 것입니다.
또한 대부분의 컴퓨터에서 getps 드라이브는 공유 드라이브를 사용하게 되며, 완벽한 검색을 위해 이 드라이브를 원할 것입니다.대부분의 공유는 파일과 폴더의 수에 관해서는 방대할 수 있기 때문에 적어도 드라이브를 크기별로 정렬하고, 검색할 때마다 체크를 추가하여 파일을 찾으면 루프를 종료합니다.10TB 공유를 검색할 때 발생하는 엄청난 시간 싱크를 절약할 수 있는 유일한 방법은 아니지만, 명령어를 언급하고 이를 사용해야 하는 모든 사용자에게 검색을 최대한 제한할 것을 강력히 제안하는 것입니다.예를 들어, 우리의 사용자 프로파일 공유는 10TB이고, 적어도 내가 있는 공유는 10TB이며, 나는 $sharedrive\users\myname 디렉토리로 검색을 제한할 수 있고, 10TB 디렉토리가 아닌 116GB 디렉토리를 검색할 수 있습니다.이러한 유형의 스크립트에 대해 공유가 있는 알 수 없는 것이 너무 많습니다. 이는 리소스 및 속도와 관련하여 이미 매우 비효율적입니다.
만약 제가 진지하게 이런 것을 사용하는 것을 고려하고 있다면, 저는 서드파티 패키지에 콜을 추가하고 DB를 활용할 것입니다.
언급URL : https://stackoverflow.com/questions/3428044/powershell-script-to-locate-specific-file-file-name
'programing' 카테고리의 다른 글
Mysql에도 mssql과 같은 @@ROWCOUNT가 있습니까? (0) | 2023.09.09 |
---|---|
표의 불일치 - Galera 군집 분석 (0) | 2023.09.09 |
페이지 로드에 대한 페이드인 효과를 위해 CSS 사용 (0) | 2023.09.09 |
GET 매개 변수에 대한 SpringMVC 요청 매핑 (0) | 2023.09.04 |
C#에서 powershell cmdlet 호출 중 (0) | 2023.09.04 |