Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件名中的Powershell字符串_Powershell - Fatal编程技术网

文件名中的Powershell字符串

文件名中的Powershell字符串,powershell,Powershell,这是我正在使用的代码,当读取主机出现时,我可以键入任何我想要的内容,例如Hello,它将在我的桌面上创建一个Hello.txt文件 我如何获得它,以便读取主机能够理解我的变量?所以你可以打电话给他们说$firstname\uu$lastname\ufile4 然后在另一个场合可以在2021年4月投入$firstname 我的变量总是相同的,我只是希望在创建文件名时能够使用它们 $firstname = 'John' $lastname = 'Smith' $ID = 324230 $filen

这是我正在使用的代码,当读取主机出现时,我可以键入任何我想要的内容,例如Hello,它将在我的桌面上创建一个Hello.txt文件

我如何获得它,以便读取主机能够理解我的变量?所以你可以打电话给他们说$firstname\uu$lastname\ufile4

然后在另一个场合可以在2021年4月投入$firstname

我的变量总是相同的,我只是希望在创建文件名时能够使用它们

$firstname = 'John'
$lastname = 'Smith'
$ID = 324230

$filename = Read-Host "What would you like to call the file?"

New-Item "C:\\Myarea\Desktop\$filename"
您可以使用:

尽管-
ExpandString
将执行原始字符串中包含的任何有效子表达式,但要小心,因此如果用户输入
$(删除项C:\Windows\System32)
,脚本将为他们执行它

为了防止此类输入,我们可以使用PowerShell的解析器为我们检查字符串表达式:

function Test-SafeExpandableString {
  param([string]$LiteralStringExpression)

  # Construct StringExpression AST
  $emptyExtent = [Activator]::CreateInstance([psobject].Assembly.GetType('System.Management.Automation.Language.EmptyScriptPosition'))
  $stringExpressionAST = [System.Management.Automation.Language.ExpandableStringExpressionAst]::new($emptyExtent, $LiteralStringExpression, [System.Management.Automation.Language.StringConstantType]::DoubleQuoted)

  # Inspect result AST's nested expressions
  foreach($expr in $stringExpressionAST.NestedExpressions){
    if($expr -isnot [System.Management.Automation.Language.VariableExpressionAst]){
      # There's a non-variable sub expression in the string, it's not safe
      return $false
    }
  }

  return $true
}
现在我们可以安全地继续:

$filename = Read-Host "What would you like to call the file?"

if(Test-SafeExpandableString $filename){
  $filenameExpanded = $ExecutionContext.InvokeCommand.ExpandString($filename)
  New-Item "C:\path\to\$filenameExpanded"
}
else {
  Write-Error "Only variable expressions allowed!"
}

您可以修改
Test SafeExpandableString
函数以接受要测试的变量名列表,我将把它作为练习留给读者:)

谢谢Mathias!如果我想用他们的名字和姓氏命名文件,然后键入'April2021',那么代码中应该怎么看呢?它看起来会像John_Smith_April2021。txt@DanielDeLaWarr然后在控制台中输入
${firstname}{lastname}{ID}.ps1
$filename = Read-Host "What would you like to call the file?"

if(Test-SafeExpandableString $filename){
  $filenameExpanded = $ExecutionContext.InvokeCommand.ExpandString($filename)
  New-Item "C:\path\to\$filenameExpanded"
}
else {
  Write-Error "Only variable expressions allowed!"
}