Функция print
является виновником - она переводит символы \x00
и \x07
в значения ASCII при выполнении. В частности, это происходит только при передаче строки в функцию print
, а не итерируемый или другой объект (например, ваш tuple
).
Это пример:
>>> s = 'This\x00string\x00is\x00an\x00\x07Example.'
>>> s
'This\x00string\x00is\x00an\x00\x07Example.'
>>> print(s)
This string is an Example.
Если вы добавите строку s
к итерируемому (tuple
, set
или list
), s
не будет быть отформатирован с помощью функции print
:
>>> s_list = [s]
>>> print(s_list) # List
['This\x00string\x00is\x00an\x00\x07Example.']
>>> print(set(s_list)) # Set
{'This\x00string\x00is\x00an\x00\x07Example.'}
>>> print(tuple(s_list)) # Tuple
('This\x00string\x00is\x00an\x00\x07Example.')
Поскольку байты \x00
и \x07
являются управляющими символами ASCII (\x00
- это NUL и \x07
). будучи БЕЛ), вы не можете представлять их по-другому. Таким образом, единственный способ, которым вы можете вырезать эти символы из строки без печати, - это использовать метод .replace()
; но учитывая, что \x00
байты обрабатываются терминалом как пробелы, вы должны использовать s.replace('\x00', ' ')
, чтобы получить тот же вывод, который теперь изменил истинное содержимое строки.
В противном случае при построении строки; Вы могли бы попытаться реализовать некоторую логику для проверки управляющих символов ASCII и либо не добавлять их в tempMess
, ни добавлять другой символ, например пробел или подобный.
ASCII Wiki: https://en.wikipedia.org/wiki/ASCII
Модуль Curses: https: // docs. python.org/3.7/library/curses.ascii.html?highlight=ascii#module-curses.ascii (может быть полезно, если вы хотите реализовать какую-либо логику).
Основываясь на ответе Steven, другое улучшение могло бы быть должно позволить загружать несколько файлов сразу:
$global:scriptdirectory = 'C:\powershellscripts'
$global:loaded_scripts = @{}
function require {
param(
[string[]]$filenames=$(throw 'Please specify scripts to load'),
[string]$path=$scriptdirectory
)
$unloadedFilenames = $filenames | where { -not $loaded_scripts[$_] }
reload $unloadedFilenames $path
}
function reload {
param(
[string[]]$filenames=$(throw 'Please specify scripts to reload'),
[string]$path=$scriptdirectory
)
foreach( $filename in $filenames ) {
. (Join-Path $path $filename)
$loaded_scripts[$filename] = Get-Date
}
}
Mike, я думаю, что те сценарии являются потрясающими. Распределение Ваших функций в библиотеки очень полезно, но я думаю, что Ваши функции для загрузки сценариев очень удобны.
Одно изменение, которое я внес бы, будет состоять в том, чтобы сделать расположение файла параметром также. Вы могли установить значение по умолчанию или даже использовать глобальную переменную для этого. Вы не должны добавлять ".ps1"
$global:scriptdirectory= 'c:\powershellscripts'
$global:loaded_scripts=@{}
function require(){
param ([string]$filename, [string]$path=$scriptdirectory)
if (!$loaded_scripts[$filename]){
. (Join-Path $path $filename)
$loaded_scripts[$filename]=get-date
}
}
function reload(){
param ([string]$filename, [string]$path=$scriptdirectory)
. (Join-Path $path $filename)
$loaded_scripts[$filename]=get-date
}
Хорошие функции!
Я думаю, что Вы найдете, что функциональность "модулей" PowerShell v2 очень удовлетворяет. В основном заботится об этом для Вас.