Powershell 스크립트로 끌어서 놓기
나는 이것에 대한 답이 있다고 생각했지만, 가지고 놀수록 파워셸의 디자인 결함으로 보입니다.
끌어서 놓기(또는 Send-To 메커니즘 사용)하여 여러 파일 및/또는 폴더를 Powershell 스크립트에 배열로 전달합니다.
테스트 스크립트
#Test.ps1
param ( [string[]] $Paths, [string] $ExampleParameter )
"Paths"
$Paths
"args"
$args
시도 #1
다음 명령줄로 바로 가기를 만들고 파일을 끌어다 놓았습니다.파일은 먼저 스크립트 매개 변수와 위치적으로 일치하는 개별 매개 변수로 나타나며, 나머지 매개 변수는 $args 배열에 배치됩니다.
시도 #1의 바로 가기
powershell.exe -noprofile -noexit -file c:\Test.ps1
래퍼 스크립트
래퍼 스크립트로 할 수 있다는 걸 알았어요...
#TestWrapper.ps1
& .\Test.ps1 -Paths $args
래퍼 스크립트의 바로 가기
powershell.exe -noprofile -noexit -file c:\TestWrapper.ps1
배치 파일 래퍼 스크립트
배치 파일 래퍼 스크립트를 통해 작동합니다.
REM TestWrapper.bat
SET args='%1'
:More
SHIFT
IF '%1' == '' GOTO Done
SET args=%args%,'%1'
GOTO More
:Done
Powershell.exe -noprofile -noexit -command "& {c:\test.ps1 %args%}"
시도된 답변
Keith Hill은 다음과 같은 바로 가기 명령줄을 사용할 것을 제안했지만, 인수를 올바르게 전달하지 못했습니다.Test.ps1 스크립트에 도착했을 때 공백이 있는 경로가 분할되었습니다.
powershell.exe -noprofile -noexit -command "& {c:\test1.ps1 $args}"
추가 스크립트 없이 이것을 할 수 있는 방법을 찾은 사람이 있습니까?
저는 이 질문이 이제 몇 년 전의 것이라는 것을 알고 있지만, 여전히 탐색기 드래그 앤 드롭을 통해 PowerShell을 실행하는 것과 관련된 많은 구글 쿼리에 대한 최고의 결과이기 때문에 다른 사람들에게 도움이 되기를 바라며 오늘 생각해낸 것을 게시하기로 했습니다.
파일을 PowerShell(ps1) 스크립트로 끌어다 놓을 수 있기를 원했지만 좋은 솔루션(추가 스크립트나 바로 가기가 필요하지 않은 솔루션)을 찾을 수 없었습니다.저는 레지스트리에 있는 파일 관련 자료들을 뒤지기 시작했고, 완벽하게 작동하는 것처럼 보이는 것을 생각해냈습니다.
먼저 의 DropHandler 항목을 추가해야 합니다.탐색기가 PS1 파일이 끌어서 놓기 작업을 수락해야 함을 알 수 있도록 PS1 파일.이 레지스트리 변경을 수행합니다.ShellEx 및 DropHandler 하위 키를 만들어야 합니다.
HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx\DropHandler\
(Default) = {60254CA5-953B-11CF-8C96-00AA00B8708C}
이 드롭 핸들러는 윈도우즈 스크립팅 호스트에서 사용하는 드롭 핸들러입니다.긴 파일 이름을 지원하기 때문에 첫 번째 선택입니다.할 경우 실행 exe 등)핸들러를 해 보십시오.{86C86720-42A0-1069-A2E8-08002B30309D}
.
두 형식의 동사두 번하는 것)를합니다.(Default)
(Shell 키의 값)을 입력합니다.PS1 파일의 경우 Open입니다.기본적으로 이 동사는 메모장에 PowerShell 스크립트를 표시하지만 그다지 유용하지 않습니다.
PS1 파일에 대한 열기 동사를 수정하여 이 동작을 변경합니다.
HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command\
(Default) = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoExit -File "%1" %*
이렇게 하면 PowerShell에서 스크립트가 실행되고 모든 매개 변수(삭제된 파일)가 전달됩니다.스크립트가 완료된 후에도 열려 있도록 설정되어 있지만, 이 설정을 변경하려면 스크립트를 제거해야 합니다.-NoExit
선택.
바로 그겁니다.광범위한 테스트를 해본 적은 없지만, 지금까지는 아주 잘 작동하는 것 같습니다.단일 파일/폴더와 그룹을 삭제할 수 있습니다.매개 변수 목록에 있는 파일의 순서가 항상 예상되는 순서(탐색기가 선택한 파일을 정렬하는 방법에 대한 특이점)는 아니지만, 그 외에는 이상적인 것 같습니다.에 PS1 파대바가만수있습도다에서 에 대한 를 만들 .Shell:Sendto
보내기 메뉴를 사용하여 파일을 전달할 수 있습니다.
다음은 REG 파일 형식의 두 가지 변경 사항입니다.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"
[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -NoExit -File \"%1\" %*"
주의:
이러한 변경의 결과로 탐색기에서 PS1 파일을 두 번 클릭하면 스크립트가 실행됩니다. 열기 대신 편집하려면 마우스 오른쪽 버튼 메뉴를 사용해야 합니다.그리고 한 가지 제안(쓰러운 경험을 통해 알게 된 바와 같이)으로, 유해한 작업을 수행하는 스크립트가 있으면 확인/위생 점검 가드를 고려할 수 있습니다.
을 통해 의 기본 는 "" " " " " " " " 입니다.
C:\Windows\system32\
조심해야 할 또 다른 이유.서명된 스크립트를 사용하지 않는 한 실행 정책(Set-ExecutionPolicy)을 변경해야 합니다.
., 은 레지스트리 키 윈도우 10의 PS1을 .
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice
기본 처리를 재정의합니다.
사용할 수 있게 된 이후 지금까지 비밀은 매개 변수 속성 "ValueFromRemainingArguments"였습니다.
삭제된 파일을 수신할 바로 가기, 배치 또는 CMD 파일
버전 5.1 이하
powershell.exe -noexit -file c:\Test.ps1
파워셸 6 이상
pwsh.exe -noexit -file c:\Test.ps1
테스트.ps1
[CmdletBinding()]
param (
[Parameter(ValueFromRemainingArguments=$true)]
$Path
)
$Path
TestExpand Directorys.ps1
[CmdletBinding()]
param (
[Parameter(ValueFromRemainingArguments=$true)]
$Path
)
foreach ($aPath in $Path) {
$aPath
if (Test-Path $aPath -PathType Container) {
Get-ChildItem $aPath -Recurse | Select-Object -ExpandProperty FullName
}
}
또한 스크립트에 매개 변수 블록이 없고 Powershell-FileScriptName.ps1을 사용하여 실행되는 경우 $args 변수에는 정확히 파일 경로 배열이 포함됩니다.
파일 또는 폴더를 Powershell 스크립트로 전달하는 가장 쉬운 방법은 다음과 같은 래퍼 스크립트입니다.
@echo off
rem the name of the script is drive path name of the Parameter %0
rem (= the batch file) but with the extension ".ps1"
set PSScript=%~dpn0.ps1
set args=%1
:More
shift
if '%1'=='' goto Done
set args=%args%, %1
goto More
:Done
powershell.exe -NoExit -Command "& '%PSScript%' '%args%'"
당신이 해야 할 일은
.bat 파일의 복사본을 만듭니다.
스크립트 파일과 동일한 이름을 지정하지만 확장자는 .bat입니다.
예: "hello.ps1" <--> "hello.bat"
파일/폴더를 배치 파일에 놓으면 스크립트로 전달됩니다.
샘플 스크립트 코드는 다음과 같습니다.
"hello world"
$args
$args.Gettype().Fullname
파일을 PowerShell 스크립트로 끌어다 놓기 -- - 추가 정보 및 솔루션
Nathan Hartley가 바로 가기 파일을 사용하여 위에 게시한 솔루션은 잘 작동합니다. (stackoverflow.com/a/45838761/80161) 참조)
A를 쉽게 사용할 수 있는 것으로 나타났습니다.동일한 결과를 가진 BAT 파일로, 둘 중 하나를 사용하여 동일한 기본 .ps1 스크립트 파일을 호출합니다.
다음은 두 가지 기술을 요약한 것입니다.아래 샘플 스크립트는 윈도우즈 PowerShell 5.1(powershell.exe)과 PowerShell 7.1(pwsh.exe)을 모두 사용하여 윈도우즈 10에서 테스트되었습니다.
파일 및 디렉터리 이름에서 여러 개의 연속 공백이 아래 기술 중 하나를 사용하여 보존됩니다. 이는 위에서 언급한 다른 솔루션의 문제였습니다. (Nathan의 솔루션은 이 점에서 잘 작동합니다. 아래 요약에는 그의 솔루션과 .bat 파일 솔루션이 포함되어 있습니다.)
샘플 바로 가기 파일:
바로 가기 속성에 다음과 같은 것을 "대상"으로 입력합니다.
powershell.exe -noexit -File "C:\Users\User\Documents\PS Scripts\your script.ps1"
또한 PowerShell 프로그램이 사용자의 경로에 있다고 가정할 때 바로 가기에 위의 내용을 입력할 때 powershell 또는 pwsh를 간단히 입력할 수 있습니다.바로 가기를 저장하거나 적용하면 이름이 자동으로 전체 절대 파일 이름으로 확장됩니다.또한 -File 매개 변수 경로 및 파일 이름에 공백이 없는 경우 호출된 .ps1 스크립트 이름 주위의 따옴표를 생략할 수 있습니다.
샘플.BAT 파일:
@echo off
set PSScript=%~dpn0.ps1
powershell.exe -NoExit -File "%PSScript%" %*
위의 다른 작성자의 게시물과 같이 을 제공합니다.BAT 파일은 해당 PowerShell 스크립트와 동일한 기본 이름입니다.물론 대신 호출된 스크립트 이름을 에 명시적으로 코딩할 수 있습니다.원하는 경우 BAT 파일이지만 위의 내용을 통해 래퍼와 .ps1 스크립트를 한 쌍으로 이동하는 것이 편리합니다.
%PSScript% 주위의 따옴표는 중요하지만 %*(모든 매개 변수가 에 전달됨).PowerShell 스크립트에 대한 BAT 스크립트)는 따옴표로 묶어서는 안 됩니다.
다음 예제 .ps1 스크립트는 위에서 호출할 수 있습니다.
옵션 1: 'ValueFromRemainingArguments' 사양을 사용하여 'named' 매개 변수로 전달된 경로 이름 수집(기본적으로 위 Nathan의 예):
param (
[Parameter(ValueFromRemainingArguments=$true)]
$Paths
)
'Paths:'
$Paths # lists the dropped path names
옵션 2: $Args 배열에서 매개 변수 선택:
# Simply reference the dropped path names in the $Args array.
# The following will list all the dropped path names.
# Yes, this is a one line .ps1 script!
$Args
다음은 "옵션 2"에 일부 단순 코드가 추가되어 전달된 경로 이름에 개별적으로 액세스하는 방법을 보여줍니다.
$Args
''
'Example of accessing passed Args individually:'
write-host "=====There are a total of $($args.count) arguments:"
for ( $i = 0; $i -lt $args.count; $i++ ) {
write-host "Argument $i is $($args[$i])"
}
2021년 6월 업데이트: 삭제된 디렉터리도 포함하고 확장할 수 있는 향상된 코드는 아래 후속 게시물을 참조하십시오.
2021년 10월 업데이트: Windows 바로 가기 접근법 또는 .bat 파일 접근법을 사용하면 일반적으로 잘 작동합니다.그러나 다음과 같은 단점에 유의하십시오..bat 파일은 새 스크립트에 대해 설정하기 매우 쉽습니다. 이전 스크립트의 복사본을 만들고 새 .ps1 스크립트와 동일한 기본 이름을 지정하기만 하면 됩니다.반면에 Windows 바로 가기에서 더 많은 파일을 삭제할 수 있습니다.예를 들어, 비교 테스트 중 하나에서 .bat 파일에 약 90개의 파일을 삭제하고 바로 가기에 약 380개의 파일을 삭제할 수 있었습니다.물론 파일이 디렉토리에 있을 때 디렉토리 이름을 삭제하면 제한을 완전히 피할 수 있습니다.
위에서 공유한 코드 옵션에 대한 참고 사항:
Nathan의 예에 표시된 [CmdletBinding()] 규격은 필요하지 않으며 [ValueFromRemainingArguments=$true] 규격에 의해 재정의되므로 이전 매개 변수에 의해 아직 선택되지 않은 나머지 모든 삭제된 파일 이름이 규격이 첨부된 명명된 $Paths 매개 변수로 수집됩니다.
위 예제의 기본 $Args 변수를 통해 삭제된 파일 이름에 액세스할 때 [CmdletBinding()] 사양을 사용하면 안 됩니다. 그렇지 않으면 전달된 모든 매개 변수에 일치하는 매개 변수 사양이 필요하므로 오류가 발생합니다.
PowerShell 스크립트에 "[CmdletBinding()" 또는 "[Parameter(ValueFromRemainingArguments=$true)" 중 어느 것도 지정되지 않고 명명된 매개 변수보다 더 많은 파일이 삭제되어 PowerShell 스크립트에 전달되는 경우, 파일 이름은 명명된 매개 변수를 통해 먼저 전달되고 나머지 파일 이름은 $Args 매개 변수로 전달됩니다.$Args[0]로 시작합니다.
위 솔루션의 핵심 요소는 해당 .ps1 스크립트를 호출하는 PowerShell 명령의 -Command 매개 변수가 아닌 -File 매개 변수를 사용하는 것입니다.
위에서 설명한 대로 바로 가기 파일 또는 배치 파일에서 powershell.exe(Windows PowerShell) 대신 pwsh.exe(PowerShell 7)를 사용할 수 있습니다.
바로 가기를 변경하여 사용해 보십시오.
powershell.exe -noprofile -noexit -command "& {c:\test1.ps1 $args}"
불하게도행,,$args
에서는 인수를 공백으로 분할하므로 인수가 포함된 파일 이름에서 잘못 작동합니다.그나여처수있다니습할리를 처리할 수 .$args
외부 래퍼 스크립트 없이 .ps1 내부!
가기에서 앤 " 위치"로이 절대에 바로또드앤드롭하로는래그보서모선가가기에택다니합분능이석구문든로스결항므목되전로으록합크달립트에절이목공백경대위치는로의낼▁since▁parse▁of▁you-하▁as,▁can또가니다합▁paths▁(능이분석-▁a▁shortcut▁foror)구-문로므바▁dragthing되send▁"달전▁absolute▁you▁every보▁on▁to▁be로▁script▁ton"drop▁space$args
각 regex 사 여 하 는 생 발 든 에 로 로 에 경 프 이 결 연 파 각 해 를 대 경 대 절 용 하 모 ▁for ▁occur ▁fore
$pattern = '([a-zA-Z]:\\(((?![<>:"/\\|?*]).)+((?<![ .])\\)?)*)(\s|$)'
Select-String "$pattern" -input "$args" -AllMatches | Foreach {$_.matches} | ForEach-Object {
$path = "$($_.Groups.Groups[1].Value)"
# ...
}
의 의위치각이 있는 곳$path
정확히 하나의 절대 경로입니다(내부에 공백이 있는 경로 포함).
절대 파일 패턴은 여기서 가져옵니다.
안에 첫 번째 시키기 위해) (첫번째그실룹경일제기위해키다치시니추묶습로했가고다를괄음과을호로▁a▁(▁i첫)다▁wrapped▁with▁and▁added니▁match▁ites▁in추)를 추가했습니다.(\s|$)
바로 가기 인수가 단일 공백으로 결합되기 때문에 끝의 그룹("공백 또는 문자열 끝")이 필요합니다. 인수 목록의 마지막 경로와 일치하려면 $가 필요합니다.
PowerShell 스크립트로 파일 끌어다 놓기 --- 후속 조치: 삭제된 디렉토리 확장
위에 올린 글의 후속 조치입니다. "PowerShell 스크립트로 파일 끌어다 놓기 -- - 추가 정보 및 솔루션".
아래 PowerShell 스크립트는 이전 게시물에서 설명한 .bat 파일 또는 바로 가기 파일 기술과 함께 사용할 수 있으며 Windows 탐색기에서 파일을 삭제할 수 있는 추가적인 유연성을 제공합니다.이 스크립트는 PowerShell 명령 프롬프트에서도 사용할 수 있습니다.
이렇게 하면 디렉터리 및 파일 이름이 혼합된 목록을 삭제할 수 있습니다.디렉토리가 확장됩니다.
명령줄에서 수동으로 실행할 때 와일드카드 문자를 사용하여 파일을 지정할 수도 있지만 디렉토리는 지정할 수 없습니다.
전달된 모든 상대 파일 이름은 정규화된 이름으로 변환되며, 이는 일부 응용프로그램에서 중요할 수 있습니다.
param (
[Parameter(ValueFromRemainingArguments=$true)]
$DroppedFiles
)
if ( $DroppedFiles.count -eq 0 ) {
Write-Host "Supply directory and/or file names. Wildcards are allowed." -ForegroundColor Red
Exit
}
[bool]$err = $False
foreach ($f in $DroppedFiles) {
if ( ( [string]::IsNullOrWhiteSpace($f) ) -or ( (Test-Path -Path $f) -eq $False ) ) {
Write-host "ERROR--File or directory does not exist: " -NoNewline -ForegroundColor Red
Write-host $f
$err = $True
}
}
if ( $err ) { Exit }
$Droppedfiles = Get-ChildItem -Path $DroppedFiles -File -Depth 0 -Recurse -ErrorAction Stop
$i = 0
foreach ($File in $DroppedFiles) {
Write-Host "Processing:" $File.FullName
$i++
}
Write-Output "$i file(s) processed."
주의:
이렇게 하면 여러 개의 혼합된 디렉토리 및 파일 이름이 처리됩니다.
디렉토리는 기본적으로 첫번째 단계로만 확장됩니다("-Depth 0"으로 설정됨).이 값을 늘리거나 제한을 모두 제거할 수 있습니다.
Get-ChildItem 행에 -Include 매개 변수를 추가하여 생성된 파일 목록을 제한할 수 있습니다(예: -Include: *.doc, *.docx).
명령줄에서 스크립트를 호출할 때 존재하지 않는 파일을 지정하면 아무 것도 반환하지 않으므로(오류가 보고되지 않음) 존재하지 않는 파일 또는 디렉터리에 대한 사전 검사가 포함됩니다.
작성된 스크립트는 PowerShell 7.1(pwsh.exe)에서 잘 작동합니다.
2021년 10월 업데이트: PowerShell 5.1에서 다중 수준 디렉터리를 삭제하고 Include 매개 변수를 동시에 사용할 때 코드 작동에 영향을 미치는 버그를 발견했습니다.위의 코드를 캡슐화한 "테스트+확장-삭제-파일" 기능에 대한 다음 게시물에서 문제의 특성과 가능한 해결책에 대한 추가 세부 정보와 의견을 확인하십시오.
위의 코드에 대한 추가 설명:
- 이전 게시물에서 설명한 대로 Windows 탐색기에서 .bat 파일 또는 바로 가기 파일의 파일을 삭제하는 데만 PowerShell 스크립트가 사용된다면(명령줄에서 스크립트를 호출하고 매개 변수를 전달하는 것과 반대로),파일을 "삭제"할 때 Windows 탐색기가 존재하는 것으로 알려진 완전한 이름을 전달하므로 초기 테스트 블록 두 개를 생략할 수 있습니다.명령줄에서 스크립트를 실행하려고 하거나 실수로 실행할 수 있는 경우 추가 테스트를 통해 매개 변수가 제공되지 않은 경우 Get-ChildItem이 기본적으로 현재 디렉터리의 모든 파일을 선택하지 못하도록 하고 사용자가 입력한 매개 변수가 있는지 확인합니다.
문자열 매개 변수가 예상되는 파워셸 스크립트로 단일 파일을 끌어다 놓기에 충분한 빠른 솔루션을 찾는 사용자는 이를 바로 가기로 사용할 수 있습니다.
powershell.exe -noprofile -noexit -command "& {.\myscript.ps1 ($args -join ' ')}"
여러 개의 연속적인 공백이 있는 파일 경로가 있는 경우 손상될 수 있지만, 이 기술을 사용해야 하는 파일을 본 적이 없기 때문에 잘 작동합니다.
PowerShell 스크립트에 삭제된 파일 이름을 확인하고 확장하는 기능
이전 두 게시물의 요점을 이해하기 위해서가 아니라 파일과 디렉터리를 삭제할 수 있는 여러 PowerShell 스크립트를 쉽게 만들기 위해 확인 및 디렉터리 확장 기능을 만들었습니다.
다음은 제가 생각해 낸 것입니다.
<#
Function: Test+Expand-Dropped-Files
Lewis Newton, 6/2021
This function will process an intermixed list of directory and file names passed to a
PowerShell script when dropped in Windows Explorer on a properly configured accompanying
Windows shortcut or .bat file. The PowerShell script or .bat file can also be called directly
from the command line.
-- This function will accept multiple intermixed directory and file names.
-- It will check that the files exist, and expand any directories recursively to the depth
specified (it defaults to 0, the top level).
-- The 'Include' parameter allows limiting what is included, for example: -Include *.doc,*.docx
It defaults to a $Null string array which will include everything found.
-- Relative file names and wildcard characters are accepted.
-- The function returns fully qualified file objects.
-- Update 10/2021: This works well with PowerShell 7.1. I found a bug in PowerShell 5.1
that affects operation when dropping multi-level directories if you supply an "-Include"
parameter at the same time; the "-Depth 0" parameter is not honored in the "Get-ChildItem"
command and you get results for any lower sub-directories as well. This is not
an issue if you are not using "-Include", or if you only drop files or single level
directories. See additional notes about possible solutions or workarounds (if this is an
issue for you) toward the end of my web posting about this script on "stackoverflow".
-- Note: "-Include $Null" (which is set as default) acts as if no parameter is present
and in that case the "-Depth" parameter is honored in PowerShell 5.1 (this is not the
case for "-Include '' ").
#>
function Test+Expand-Dropped-Files {
param(
$DroppedFiles,
[string]$Depth = "0",
[string[]]$Include = $Null
)
if ( $DroppedFiles.count -eq 0 ) {
Write-Host "Supply directory and/or file names. Wildcards are allowed." -ForegroundColor Red
Exit
# Makes sure there is at least one parameter, or Get-ChildItem defaults to all in current directory.
}
[bool]$err = $False
foreach ($f in $DroppedFiles) {
if ( ( [string]::IsNullOrWhiteSpace($f) ) -or ( (Test-Path -Path $f) -eq $False ) ) {
Write-host "ERROR--File or directory does not exist: " -NoNewline -ForegroundColor Red
Write-host $f
$err = $True
}
}
if ( $err ) { Exit }
$Droppedfiles = Get-ChildItem -Path $DroppedFiles -File -Recurse -Depth $Depth -Include $Include -ErrorAction Stop
# '-Depth 0' limits expansion of files in directories to the top level.
# '-Include $Null' will include everything.
Write-Output $DroppedFiles
}
스크립트의 함수에 대한 액세스를 제공하기 위해 "function_Test+Expand-Dropped-Files.ps1"이라는 파일에 위의 내용을 넣은 다음 시스템 경로의 디렉토리에서 이를 닷 소스합니다.
다음은 삭제된 파일 및 디렉터리를 쉽게 선택할 수 있도록 함수를 호출하기 위해 스크립트의 시작 부분에 추가한 예입니다.
param ( [Parameter(ValueFromRemainingArguments=$true)] $DroppedFiles )
. function_Test+Expand-Dropped-Files
$DroppedFiles = Test+Expand-Dropped-Files $DroppedFiles -Depth 0 -Include $Null
# '-Depth 0' limits directory expansion to first level.
# '-Include' can specify a string array of specifications, such as: -Include *.doc,*.docx
# '-Depth' and '-Include' are optional and default to 0 and $Null (includes all) respectively.
다음은 $DroppedFiles 매개 변수에 전달된 삭제된 파일 이름을 선택하고 처리하는 샘플 루프입니다.
$i = 0
foreach ($File in $DroppedFiles) {
Write-Host "Processing:" $File.FullName
$i++
}
Write-Output "$i file(s) processed.`n"
주의:
이제 스크립트를 호출하는 .bat 파일 또는 Windows 바로 가기 파일(이전 게시물에서 설명한 대로)을 만들 수 있습니다. 여기에 Windows 탐색기에서 파일 및 디렉터리를 끌어다 놓을 수 있습니다.물론 PowerShell 내에서 .ps1 스크립트를 직접 호출하여 명령줄에 파일 이름(와일드카드 포함)과 디렉터리 이름을 제공할 수도 있습니다.
위에서 제안한 것처럼 위의 기능을 도트 소스화하는 또 다른 방법은 PowerShell 프로필에 "Test+Expand-Droped-Files" 기능을 넣거나 이 기능을 PowerShell 모듈로 설정하는 것입니다.
업데이트--2021년 10월: PowerShell 5.1과 함께 사용할 때 발견된 문제:
(또한 위 함수의 스크립트 코드에 있는 주석에 이 문제에 대한 참고 사항을 추가했습니다.)
맨 아래 줄:PowerShell 7.1을 사용하는 경우 이 기능은 그대로 작동합니다.PowerShell 5.1을 사용하는 경우 "-포함" 매개 변수를 사용하는 경우에만 하위 수준의 디렉터리가 있으면 함수가 다시 실행됩니다.문제가 발생한 경우 아래의 세부 정보와 이 문제를 해결하기 위한 몇 가지 제안 사항을 참조하십시오.
PowerShell 5.1과 함께 사용할 때 "Get-ChildItem"(함수에서 이 항목을 호출함)의 작동에 버그가 있다는 것을 발견했습니다."-포함"을 사용하는 경우 "-포함" 옵션이 전달된 디렉토리로 이동해야 하지만 깊이를 제한하고("-깊이 0"에서와 같이) "-포함" 매개 변수를 제공하는 경우 깊이는 무시되고 PowerShell 5.1의 트리에서 반복됩니다.PowerShell 7.1에서는 "-Depth" 매개 변수가 제대로 작동하며, 이 경우에는 깊이가 지정된 수준으로 제한됩니다.
"-포함" 매개변수를 사용하는 대신 "-필터" 매개변수를 사용하는 것은 깊이 매개변수를 준수하지만 어떤 면에서는 유연하지 않습니다.또한 "-Filter *.doc"도 5.1에서는 ".docx" 파일을 선택하지만 7.1에서는 선택하지 않습니다.7.1에서는 "-Filter *.doc*"를 사용하여 두 가지 유형의 파일을 모두 선택할 수 있지만, 파일 이름 앞에 있는 문자열을 선택할 수도 있습니다.
위에서 언급한 PowerShell 버전 중 하나에 대한 명확한 참고 사항으로, "-포함" 매개 변수를 사용하지 않고 "-재사용"을 지정하지 않고 "Get-ChildItem"에 디렉토리 이름을 전달하면, 이 경우 전달된 디렉토리의 최상위 수준 파일을 얻을 수 있습니다.이는 "-필터"를 사용하는 경우에도 마찬가지입니다.그러나 위에서 설명한 대로 "-포함"을 사용하는 경우 최상위 수준의 파일을 가져오려면 "-반복"과 "-깊이 0"이 필요합니다.
PowerShell 버전에서 작동하는 기능을 만드는 또 다른 옵션은 "-포함" 없이 "자녀 항목 가져오기"를 사용하여 "-깊이" 매개 변수를 지정한 다음, 포함할 파일을 추출하는 간단한 코드 루프를 명시적으로 수행하는 것입니다.
PowerShell 7.1을 사용하는 한 기능은 그대로 사용할 수 있고, 제 기능은 의도한 대로 작동합니다.언젠가 PowerShell 5.1의 버그가 해결될 것입니다.
요약:이 문제는 PowerShell 5.1에서만 발생하며, "-포함"을 사용하지 않거나 파일 또는 단일 수준 디렉터리만 삭제하는 경우에는 문제가 되지 않습니다.
언급URL : https://stackoverflow.com/questions/2819908/drag-and-drop-to-a-powershell-script
'source' 카테고리의 다른 글
우분투에서 이클립스의 루트로 애플리케이션을 디버그하는 방법은 무엇입니까? (0) | 2023.08.25 |
---|---|
여전히 경고 메시지가 표시됨: 구성 'compile'이 더 이상 사용되지 않으며 '구현'으로 대체되었습니다. (0) | 2023.08.25 |
Javascript에서 HTTP 특정 헤더를 제거하는 방법 (0) | 2023.08.25 |
jQuery 데이터 속성 값으로 요소 찾기 (0) | 2023.08.25 |
Powershell의 빠르고 간단한 이진 연결 파일 (0) | 2023.08.25 |