programing

파일 이름을 저장하기 전에 불법 문자를 제거하는 방법?

css3 2023. 10. 17. 20:26

파일 이름을 저장하기 전에 불법 문자를 제거하는 방법?

사용법을 찾을 수 있었습니다.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