파일 이름을 저장하기 전에 불법 문자를 제거하는 방법?
사용법을 찾을 수 있었습니다.GetInvalidFileNameChars()
powerShell 스크립트의 메서드입니다.하지만 빈 공간(내가 원하지 않는 공간)도 걸러내는 것 같습니다.
편집: 아마 제가 이것을 충분히 명확하게 요구하고 있지는 않을 겁니다.나는 아래 기능에 파일 이름에 이미 존재하는 공간이 포함되기를 원합니다.현재 스크립트는 공백을 필터링합니다.
Function Remove-InvalidFileNameChars {
param([Parameter(Mandatory=$true,
Position=0,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[String]$Name
)
return [RegEx]::Replace($Name, "[{0}]" -f ([RegEx]::Escape([String][System.IO.Path]::GetInvalidFileNameChars())), '')}
문자 배열을 다음으로 캐스팅System.String
실제로 배열 요소와 공간을 결합하는 것처럼 보입니다. 즉,
[string][System.IO.Path]::GetInvalidFileNameChars()
와 같은 일을 합니다.
[System.IO.Path]::GetInvalidFileNameChars() -join ' '
당신이 정말 원할때
[System.IO.Path]::GetInvalidFileNameChars() -join ''
@mjolinor님이 말씀하신 (+1)과 같이 출력장 구분자($OFS
).
증거:
PSC:\> [RegEx]::탈출([스트링]]IO.Path]:: 올바르지 않은 파일 이름Chars 가져오기() 가져오기"\ \ \| \| \☺ \ ♥ \ ☻ \ ♦ \ ♣ \ ♠ \ ♂ \ \ t \ \ \n \n \ ↕ \f \ \r \ ♫ \ ☼ \ ► \ ◄ \ ↨ \ ▬ \ ↑ \ ↓ \ ← \ → \ ∟ \ § \ ↔ \ ∟ \ ▲ \ ▼ \ ‼ \ * : \* \? \\ \\ \\ \\ \\ \\ \ \ \ \ \ \ \ \ \ \ \ \ \ / /PSC:\> [RegEx]::탈출([IO]).경로]:::잘못된 파일 이름Chars() -join ' ' )를 가져옵니다. "\ \ \| \| \☺ \ ♥ \ ☻ \ ♦ \ ♣ \ ♠ \ ♂ \ \ t \ \ \n \n \ ↕ \f \ \r \ ♫ \ ☼ \ ► \ ◄ \ ↨ \ ▬ \ ↑ \ ↓ \ ← \ → \ ∟ \ § \ ↔ \ ∟ \ ▲ \ ▼ \ ‼ \ * : \* \? \\ \\ \\ \\ \\ \\ \ \ \ \ \ \ \ \ \ \ \ \ \ / /PSC:\> [RegEx]::탈출([IO]).경로]:::잘못된 파일 이름Chars() -join '')를 가져옵니다. "\| ☺ ☻♥♦\t\n♂\f\r ♫☼►◄↕‼ §▬↨↑↓→← ∟↔▲▼:\*\?\\/PSC:\> $OFS="PSC:\> [RegEx]::탈출([스트링]]IO.Path]:: 올바르지 않은 파일 이름Chars 가져오기() 가져오기 "\| ☺ ☻♥♦\t\n♂\f\r ♫☼►◄↕‼ §▬↨↑↓→← ∟↔▲▼:\*\?\\/
기능을 다음과 같이 변경합니다.
Function Remove-InvalidFileNameChars {
param(
[Parameter(Mandatory=$true,
Position=0,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[String]$Name
)
$invalidChars = [IO.Path]::GetInvalidFileNameChars() -join ''
$re = "[{0}]" -f [RegEx]::Escape($invalidChars)
return ($Name -replace $re)
}
원하는 대로 할 수 있을 겁니다
현재 가장 좋아하는 방법은 다음과 같습니다.
$Path.Split([IO.Path]::GetInvalidFileNameChars()) -join '_'
잘못된 모든 문자를 다음으로 바꿉니다._
그리고 다음과 같은 대안에 비해 매우 인간적으로 읽을 수 있습니다.
$Path -replace "[$([RegEx]::Escape([string][IO.Path]::GetInvalidFileNameChars()))]+","_"
비표시 문자가 regex 연산을 위해 [string](문자열)로 강제되는 것(그리고 결국 공백으로 표현되는 것)과 관련이 있다고 생각합니다.
이것이 더 잘 작동하지 않는지 확인합니다.
([char[]]$name | where { [IO.Path]::GetinvalidFileNameChars() -notcontains $_ }) -join ''
이렇게 하면 직접적인 차를 비교할 수 있고 보다 신뢰성이 높은 것 같습니다(내장 공간은 제거되지 않음).
$name = 'abc*\ def.txt'
([char[]]$name | where { [IO.Path]::GetinvalidFileNameChars() -notcontains $_ }) -join ''
abc def.txt
편집 - 문자열에 문자 배열을 캐스팅하여 발생하는 공간에 대해 @Ansgar가 맞는 것 같습니다.$OFS에서 공간을 소개하고 있습니다.
나는 공간이 모든 불법적인 캐릭터들을 대체할 수 있는 공간을 원해서 공간이 공간으로 대체되기를 원했습니다.
$Filename = $ADUser.SamAccountName
[IO.Path]::GetinvalidFileNameChars() | ForEach-Object {$Filename = $Filename.Replace($_," ")}
$Filename = "folder\" + $Filename.trim() + ".txt"
기본 기능이 동일한 이 원라이너를 사용해보세요.
어울리게
'?Some "" File Name <:.txt' -match ("[{0}]"-f (([System.IO.Path]::GetInvalidFileNameChars()|%{[regex]::Escape($_)}) -join '|'))
대체할
'?Some "" File Name <:.txt' -replace ("[{0}]"-f (([System.IO.Path]::GetInvalidFileNameChars()|%{[regex]::Escape($_)}) -join '|')),'_'
[System.IO.Path]::GetInvalidFileNameChars()
잘못된 문자 배열을 반환합니다.공간 문자를 반환하는 경우에는 항상 배열을 반복하고 제거할 수 있습니다.
> $chars = @()
> foreach ($c in [System.IO.Path]::GetInvalidFileNameChars())
{
if ($c -ne ' ')
{
$chars += $c
}
}
그러면 사용할 수 있습니다.$chars
당신이 사용했을 것처럼.GetInvalidFileNameChars()
.
매우 약간 다른 조합된 유연한 접근 방식.GetInvalidFileNameChars()가 필요한 모든 불법 chars를 얻지 못하고 있음을 발견했습니다.
$arrInvalidChars = '[]/|\+={}-$%^&*()'.ToCharArray()
$cleanName = 'a[]|\+={9}-$%^&*()\b'
$arrInvalidChars | % { $cleanName = $cleanName.replace($_,'_')}
$cleanName = 'a_____9_______________b'를 반환합니다.
언급URL : https://stackoverflow.com/questions/23066783/how-to-strip-illegal-characters-before-trying-to-save-filenames
'programing' 카테고리의 다른 글
Jquery AJAX를 사용하여 MVC Action을 호출한 후 MVC에서 양식을 제출하는 방법은 무엇입니까? (0) | 2023.10.17 |
---|---|
외국 키가 있는 경우에만 삭제 (0) | 2023.10.17 |
WooCommerce에서 정가전 판매가격 표시 (0) | 2023.10.17 |
동일하지 않은 값에 대한 mysql 구문 (0) | 2023.10.12 |
HTTP에서 HTTPS로의 리디렉션이 AWS ALB에서 작동하지 않음 (0) | 2023.10.12 |